{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fe98a9e5-4646-47d0-9445-19bf22ef3a54",
   "metadata": {},
   "source": [
    "# <center>Ch4 强化学习PPO详解 </center>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "007af21a",
   "metadata": {},
   "source": [
    "# 为什么要学习强化学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6036ac87",
   "metadata": {},
   "source": [
    "1. ChatGPT的成功\n",
    "   - 使用RLHF(基于人类反馈的强化学习)进行微调\n",
    "   - 显著提升了模型的实用性和安全性\n",
    "\n",
    "2. RLHF的核心算法就是PPO\n",
    "   - PPO用于从人类反馈中学习\n",
    "   - 帮助模型更好地对齐人类偏好\n",
    "\n",
    "3. 带动PPO算法的关注\n",
    "   - 研究者开始深入研究PPO原理\n",
    "   - 工程师学习PPO以便应用到自己的项目\n",
    "\n",
    "**RLHF为什么选择PPO？**\n",
    "1. PPO特性非常适合RLHF场景：\n",
    "   - 策略裁剪防止过度更新\n",
    "   - 训练稳定性好\n",
    "   - 实现相对简单\n",
    "\n",
    "2. 实践证明效果好：\n",
    "   - ChatGPT成功验证了PPO在RLHF中的效果\n",
    "   - 其他公司也纷纷采用类似方案\n",
    "\n",
    "**学习PPO的现实意义**\n",
    "1. 理解RLHF的技术原理\n",
    "   - 了解大模型是如何从人类反馈中学习的\n",
    "   - 掌握对齐人类偏好的关键技术\n",
    "\n",
    "2. 实际应用需求\n",
    "   - 很多公司在尝试复现RLHF\n",
    "   - PPO成为大模型微调的必备知识\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83e06a91",
   "metadata": {},
   "source": [
    "PPO 核心函数 \n",
    "$$\n",
    "L^{CLIP}(\\theta) = \\mathbb{E}_t \\left[ \\min \\left( r_t(\\theta) \\hat{A}_t, \\text{clip}(r_t(\\theta), 1-\\epsilon, 1+\\epsilon) \\hat{A}_t \\right) \\right]\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2615a20",
   "metadata": {},
   "source": [
    "# 1.强化学习基本概念讲解 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a2a4cee",
   "metadata": {},
   "source": [
    "智能体(Agent)与环境(Environment)的交互   \n",
    "状态(State)：环境在某时刻的描述   \n",
    "动作(Action)：智能体可以执行的行为    \n",
    "奖励(Reward)：环境对动作的反馈      \n",
    "策略(Policy)：决定在某状态下采取什么动作   "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4a21cd0",
   "metadata": {},
   "source": [
    "滑雪游戏来详细解释这些概念：\n",
    "\n",
    "1. 智能体(Agent)与环境(Environment)的交互：\n",
    "- 智能体：滑雪者(AI控制的角色)\n",
    "- 环境：整个滑雪场景，包括雪道、障碍物、旗门等\n",
    "- 交互过程：\n",
    "  * 滑雪者观察前方路况\n",
    "  * 决定如何移动\n",
    "  * 环境返回新的画面和得分\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0d68da2",
   "metadata": {},
   "source": [
    "2. 状态(State)：\n",
    "- 表示当前游戏画面的关键信息：\n",
    "  * 滑雪者的位置\n",
    "  * 滑雪者的速度\n",
    "  * 前方障碍物的位置（树木、石头）\n",
    "  * 旗门的位置\n",
    "  * 地形的坡度\n",
    "  * 与最近障碍物的距离"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "604adef4",
   "metadata": {},
   "source": [
    "3. 动作(Action)：\n",
    "- 滑雪者可以执行的操作：\n",
    "  * 向左转\n",
    "  * 向右转\n",
    "  * 直行\n",
    "  * 减速\n",
    "  * 加速"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2cf82f8f",
   "metadata": {},
   "source": [
    "4. 奖励(Reward)：\n",
    "- 游戏给出的即时反馈：\n",
    "  * 成功通过旗门：+10分\n",
    "  * 收集金币：+1分\n",
    "  * 撞到障碍物：-50分\n",
    "  * 安全滑行：+0.1分/步\n",
    "  * 到达终点：+100分\n",
    "  * 摔倒或撞树：游戏结束，-100分"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7fbb44fe",
   "metadata": {},
   "source": [
    "5. 策略(Policy)：\n",
    "- AI学到的\"经验法则\"，例如：\n",
    "  * 看到前方有树→向旁边转向避开\n",
    "  * 看到旗门→调整方向以通过旗门\n",
    "  * 看到开阔地形→可以加速\n",
    "  * 看到危险地形→提前减速"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d73d37e4",
   "metadata": {},
   "source": [
    "整个学习过程是这样的：\n",
    "1. AI观察当前画面(状态)\n",
    "2. 根据学到的策略选择动作(转向/加速等)\n",
    "3. 执行动作，游戏状态发生变化\n",
    "4. 获得相应的奖励(分数)\n",
    "5. 根据这次经验调整策略\n",
    "6. 不断重复这个过程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1cb046d1",
   "metadata": {},
   "source": [
    "PPO算法的特点：\n",
    "- 像一个谨慎的教练，每次只对策略做小幅调整\n",
    "- 比如：\n",
    "  * 如果发现某个动作效果好(成功避开障碍)\n",
    "  * 会稍微增加在类似情况下选择该动作的概率\n",
    "  * 但不会一下子改变太多，避免过度调整\n",
    "\n",
    "通过这样的学习：\n",
    "- AI逐渐掌握如何安全且高效地滑雪\n",
    "- 学会在不同情况下做出合适的反应\n",
    "- 最终目标是获得最高的累积分数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb867a24",
   "metadata": {},
   "source": [
    "目标：\n",
    "- 通过不断尝试和学习\n",
    "- 找到一个最优策略\n",
    "- 使得长期累积奖励最大化\n",
    "\n",
    "这就是强化学习最基础的框架，PPO算法就是在这个框架下，提出了一种更有效的策略学习方法。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e078ed4e",
   "metadata": {},
   "source": [
    "# 2.PPO前置概念学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28f58569",
   "metadata": {},
   "source": [
    "## 2.1 马尔可夫决策过程(MDP)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c5147e0",
   "metadata": {},
   "source": [
    "马尔可夫决策过程是一个数学框架，用于描述智能体与环境交互的过程。它包含5个基本要素(S, A, P, R, γ):\n",
    "\n",
    "1. 状态空间(State Space) S:\n",
    "- 描述环境在某一时刻的所有可能状态\n",
    "- 在滑雪游戏中包括:\n",
    "  * 滑雪者的位置坐标(x,y)\n",
    "  * 滑雪者的速度\n",
    "  * 前方障碍物的位置\n",
    "  * 当前得分等"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bea85b8",
   "metadata": {},
   "source": [
    "2. 动作空间(Action Space) A:\n",
    "- 智能体在每个状态下可以采取的所有可能动作\n",
    "- 在滑雪游戏中包括:\n",
    "  * 向左转\n",
    "  * 向右转\n",
    "  * 加速\n",
    "  * 减速等"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41069401",
   "metadata": {},
   "source": [
    "3. 状态转移概率(State Transition Probability) P(s'|s,a):\n",
    "- 理论定义：在状态s下执行动作a后，转移到状态s'的概率\n",
    "- 在滑雪游戏中：\n",
    "  * s：当前状态(位置、速度、前方障碍物等)\n",
    "  * a：执行的动作(如向左转)\n",
    "  * s'：可能的下一个状态\n",
    "- 具体例子：   \n",
    "\n",
    "  当前状态s：\n",
    "  - 位置：(x=100, y=200)\n",
    "  - 速度：10m/s\n",
    "  - 前方5米处有树\n",
    "  \n",
    "  动作a：向左转30度\n",
    "  \n",
    "  可能的下一状态s'及其概率：\n",
    "  1. 80%概率：\n",
    "     - 新位置：(x=97, y=204)\n",
    "     - 速度：9m/s\n",
    "     - 成功避开树\n",
    "  2. 15%概率：\n",
    "     - 新位置：(x=99, y=204)\n",
    "     - 速度：9m/s\n",
    "     - 仍在撞树路径上\n",
    "  3. 5%概率：\n",
    "     - 新位置：(x=95, y=203)\n",
    "     - 速度：7m/s\n",
    "     - 失去平衡"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6698151a",
   "metadata": {},
   "source": [
    "4. 奖励函数(Reward Function) R(s,a,s'):\n",
    "- 执行动作a从状态s转移到s'时获得的即时奖励\n",
    "- 例如:\n",
    "  * 安全滑行: +1分\n",
    "  * 撞树: -50分\n",
    "  * 通过旗门: +10分\n",
    "  * 到达终点: +100分"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb9199a3",
   "metadata": {},
   "source": [
    "5. 折扣因子(Discount Factor) γ:\n",
    "- 用于权衡即时奖励和未来奖励的重要性\n",
    "- 取值范围[0,1]\n",
    "- 例如γ=0.9时:\n",
    "  * 当前获得的10分 = 10分\n",
    "  * 1步后获得的10分 = 10 × 0.9 = 9分\n",
    "  * 2步后获得的10分 = 10 × 0.9² = 8.1分"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5de5aa3c",
   "metadata": {},
   "source": [
    "这5个要素共同定义了一个完整的决策问题:\n",
    "1. 智能体观察当前状态\n",
    "2. 根据策略选择动作\n",
    "3. 环境根据转移概率产生新状态\n",
    "4. 智能体获得相应奖励\n",
    "5. 不断重复这个过程\n",
    "\n",
    "目标是找到一个最优策略,使得期望的累积折扣奖励最大化。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f39e8f7",
   "metadata": {},
   "source": [
    "## 2.2 折扣因子"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11766a22",
   "metadata": {},
   "source": [
    "数学表达：当前时刻t的奖励 $r_t$ 的未来价值 = $r_t$  ×  $γ^t$ \n",
    "- 在滑雪游戏中：\n",
    "```json\n",
    "  假设 γ = 0.9，一段滑雪过程的奖励序列：\n",
    "  t=0: 安全滑行 +1分\n",
    "  t=1: 通过旗门 +10分\n",
    "  t=2: 收集金币 +2分\n",
    "  t=3: 安全滑行 +1分\n",
    "  \n",
    "  折扣后的价值：\n",
    "  1 × (0.9)⁰ = 1         # t=0时刻的奖励,不折扣\n",
    "  10 × (0.9)¹ = 9        # t=1时刻的奖励,折扣1次 \n",
    "  2 × (0.9)² = 1.62      # t=2时刻的奖励,折扣2次\n",
    "  1 × (0.9)³ = 0.729     # t=3时刻的奖励,折扣3次\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8f2032b",
   "metadata": {},
   "source": [
    "回报(return)：\n",
    "- 理论定义：从当前时刻开始所有未来奖励的折扣和\n",
    "- 在滑雪游戏中：\n",
    "  ```json\n",
    "  把所有折扣后的价值加起来\n",
    "   1 (t=0时刻的折扣价值)\n",
    "   9 (t=1时刻的折扣价值)\n",
    "   1.62 (t=2时刻的折扣价值)\n",
    "   0.729 (t=3时刻的折扣价值)\n",
    "\n",
    "  R0 = 1 + (0.9×10) + (0.9²×2) + (0.9³×1)\n",
    "     = 1 + 9 + 1.62 + 0.729\n",
    "     = 12.349\n",
    "  ```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b60378aa",
   "metadata": {},
   "source": [
    "轨迹\n",
    "- 理论定义：一个完整的状态-动作-奖励序列\n",
    "- 在滑雪游戏中：\n",
    "  ```json\n",
    "  一次完整滑雪过程的轨迹：\n",
    "  t=0:\n",
    "    状态s0: 起点位置(x=0,y=0), 速度=0\n",
    "    动作a0: 直行\n",
    "    奖励r0: +1(安全滑行)\n",
    "  \n",
    "  t=1:\n",
    "    状态s1: 位置(x=0,y=10), 速度=5, 前方有旗门\n",
    "    动作a1: 右转15度\n",
    "    奖励r1: +10(通过旗门)\n",
    "  \n",
    "  t=2:\n",
    "    状态s2: 位置(x=2,y=20), 速度=7, 前方有树\n",
    "    动作a2: 左转45度\n",
    "    奖励r2: +2(收集金币)\n",
    "  ...直到结束\n",
    "  ```\n",
    "\n",
    "这些概念的重要性：\n",
    "1. 状态转移概率：描述环境的不确定性，帮助AI预测动作后果\n",
    "2. 折扣因子：平衡短期和长期收益，防止无限累积\n",
    "3. 回报：提供优化目标，AI的目标是最大化期望回报\n",
    "4. 轨迹：记录完整经验，用于策略学习和评估\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ab0225c",
   "metadata": {},
   "source": [
    "**1.为什么要有折扣因子？**\n",
    "- 现实原因：\n",
    "  * 在真实环境中，越远的未来越不确定\n",
    "  * 比如滑雪时，我们更关注眼前的障碍物，而不是很远处的情况\n",
    "  * 近期的决策(如避开眼前的树)比远期的决策更重要\n",
    "\n",
    "- 技术原因：\n",
    "  * 如果不打折扣，在无限时间的游戏中，总回报可能变成无穷大\n",
    "  * 即使是+1分的小奖励，无限累积也会变成无穷大\n",
    "  * 这样会导致无法比较不同策略的好坏"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f112a19e",
   "metadata": {},
   "source": [
    "无法比较策略的优劣：\n",
    "- 如果允许无限累积，任何能让智能体\"活着\"的策略最终都会得到无限分\n",
    "- 比如：\n",
    "  * 策略A：冒险快速到达终点\n",
    "  * 策略B：在安全区域来回移动\n",
    "  假设不用折扣因子：\n",
    "```json\n",
    "      简单滑行每步+1分：\n",
    "      10步：10分\n",
    "      100步：100分\n",
    "      1000步：1000分\n",
    "      ...无限步：无限分\n",
    "```\n",
    "  * 如果不打折扣，B策略通过无限累积小奖励也能得到无限高分\n",
    "  * 这样就无法区分哪个策略更好\n",
    "\n",
    "2. 数学计算问题：\n",
    "- 无限累积会导致计算发散\n",
    "- 使用折扣因子后，即使是无限步骤，总回报也会收敛到一个有限值\n",
    "```json\n",
    "    使用折扣因子(γ=0.9)：\n",
    "    10步：1 + 0.9 + 0.9² + ... + 0.9⁹ ≈ 6.51分\n",
    "    100步：有限值\n",
    "    无限步：最终收敛到有限值\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bc6877e",
   "metadata": {},
   "source": [
    "**2. 为什么时刻越晚，折扣越多？**\n",
    "```json\n",
    "例如在滑雪过程中：\n",
    "t=0: 看到树，立即转向避开 (+5分)\n",
    "t=1: 通过旗门 (+10分)\n",
    "t=2: 收集远处的金币 (+1分)\n",
    "\n",
    "使用折扣因子γ=0.9：\n",
    "当前的5分 = 5 × 0.9⁰ = 5分\n",
    "1步后的10分 = 10 × 0.9¹ = 9分\n",
    "2步后的1分 = 1 × 0.9² = 0.81分\n",
    "```\n",
    "- 这反映了一个重要思想：\n",
    "  * 立即避开危险比获得远处的奖励更重要\n",
    "  * 近期的正确决策对生存更关键\n",
    "  * 远期的回报存在更多不确定性"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0573d2dd",
   "metadata": {},
   "source": [
    "\n",
    "**3.PPO怎么平衡折扣因子γ**\n",
    "\n",
    "1. 长期收益仍然很重要：\n",
    "- γ通常设置得很接近1（如0.99）\n",
    "- 这意味着远期收益仍然有很大权重\n",
    "- AI会考虑长远的决策影响\n",
    "\n",
    "2. 折扣因子的真正作用：\n",
    "- 平衡近期和远期收益\n",
    "- 提供数学上的收敛保证\n",
    "- 反映未来的不确定性\n",
    "\n",
    "3. 以滑雪游戏为例：\n",
    "```json\n",
    "    设γ=0.99时：\n",
    "    t=0: 安全滑行 (+1) × 0.99⁰ = 1\n",
    "    t=1: 通过旗门 (+10) × 0.99¹ = 9.9\n",
    "    t=10: 到达终点 (+100) × 0.99¹⁰ = 90.4\n",
    "\n",
    "    AI会权衡：\n",
    "    - 是否值得冒险通过难度大的旗门\n",
    "    - 是否应该选择更安全但更长的路线\n",
    "    - 如何在速度和安全性之间平衡\n",
    "```\n",
    "4. 关键点：\n",
    "- 折扣因子不是为了忽视远期收益\n",
    "- 而是为了合理权衡近期和远期收益\n",
    "- 通常γ设置得很接近1（如0.99），表示远期收益仍然很重要\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3caa4f09",
   "metadata": {},
   "source": [
    "## 2.3 价值函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "073143a8",
   "metadata": {},
   "source": [
    "价值函数相关：\n",
    "- 状态价值函数V(s)\n",
    "- 动作价值函数Q(s,a)\n",
    "- 优势函数(Advantage)：A(s,a) = Q(s,a) - V(s)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ea1fe7a",
   "metadata": {},
   "source": [
    "**1. 状态价值函数 V(s)：**\n",
    "- 定义：从状态s开始，按照当前策略π行动，能获得的期望累积折扣奖励\n",
    "- 数学表达：$ V(s) = E[r_t + \\gamma r_{t+1} + \\gamma^2 r_{t+2} + \\cdots] $\n",
    "- 在滑雪游戏中："
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d80149b",
   "metadata": {},
   "source": [
    "\n",
    "```json\n",
    "例如某个状态s：\n",
    "- 位置：在半山腰\n",
    "- 前方10米有一排旗门\n",
    "- 左侧15米有树\n",
    "- 速度适中\n",
    "\n",
    "V(s)评估这个状态的\"价值\"：\n",
    "- 预计能获得的总分数\n",
    "- 可能包括：\n",
    "  * 即将通过旗门得到的10分\n",
    "  * 之后可能收集到的金币\n",
    "  * 最终到达终点的奖励\n",
    "  * 减去可能撞树的风险\n",
    "\n",
    "映射滑雪游戏中一个序列：\n",
    "\n",
    "t=0 (当前)：\n",
    "- 状态s0：在起点\n",
    "- 动作a0：直行\n",
    "- 奖励R0：安全滑行 +1分\n",
    "\n",
    "t=1 (下一步)：\n",
    "- 状态s1：接近旗门\n",
    "- 动作a1：右转\n",
    "- 奖励R1：通过旗门 +10分\n",
    "\n",
    "t=2 (再下一步)：\n",
    "- 状态s2：遇到金币\n",
    "- 动作a2：直行\n",
    "- 奖励R2：收集金币 +2分\n",
    "\n",
    "计算状态价值V(s0)：\n",
    "V(s0) = R0 + γR1 + γ²R2\n",
    "      = 1 + 0.9×10 + 0.9²×2\n",
    "      = 1 + 9 + 1.62\n",
    "      = 11.62分\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e985d68",
   "metadata": {},
   "source": [
    "**2. 动作价值函数 Q(s,a)：**\n",
    "- 定义：在状态s下执行动作a，之后按策略π行动能获得的期望累积折扣奖励\n",
    "- 数学表达：Q(s,a) = R(s,a) + γE[V(s')]\n",
    "- 在滑雪游戏中：\n",
    "```json\n",
    "同样的状态s，考虑不同动作：\n",
    "\n",
    "Q(s, 向左转)：\n",
    "- 立即避开树木(+5分)\n",
    "- 但可能错过旗门(-10分)\n",
    "- 后续路径较安全\n",
    "\n",
    "Q(s, 直行)：\n",
    "- 能通过旗门(+10分)\n",
    "- 但有撞树风险(-50分)\n",
    "- 后续路径不确定\n",
    "\n",
    "Q(s, 向右转)：\n",
    "- 错过旗门(-10分)\n",
    "- 完全避开树木(+5分)\n",
    "- 后续路径较好\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ca5f885",
   "metadata": {},
   "source": [
    "```json\n",
    "在滑雪游戏中：\n",
    "当前状态s：在半山腰\n",
    "动作a：向左转\n",
    "\n",
    "即使我们选择了明确的动作，但结果仍是不确定的：\n",
    "- 可能成功避开树(80%概率)\n",
    "- 可能转向不够(15%概率)\n",
    "- 可能失去平衡(5%概率)\n",
    "\n",
    "考虑两个动作选择：\n",
    "\n",
    "    动作A：保守转向\n",
    "    R(s,a) = 5分\n",
    "    下一状态可能性：\n",
    "    - 90%：安全位置 V(s1') = 20分\n",
    "    - 10%：稍差位置 V(s2') = 15分\n",
    "    Q(s,a) = 5 + 0.9×(0.9×20 + 0.1×15) = 21.85分\n",
    "\n",
    "    动作B：激进转向\n",
    "    R(s,a) = 10分\n",
    "    下一状态可能性：\n",
    "    - 60%：最佳位置 V(s1') = 30分\n",
    "    - 30%：一般位置 V(s2') = 10分\n",
    "    - 10%：危险位置 V(s3') = -20分\n",
    "    Q(s,a) = 10 + 0.9×(0.6×30 + 0.3×10 + 0.1×(-20)) = 20.9分\n",
    "```\n",
    "- 虽然动作B的最好结果更好(30分)\n",
    "- 但考虑所有可能性后，动作A的期望值更高\n",
    "- 这帮助AI做出更稳妥的决策"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "025f0bcb",
   "metadata": {},
   "source": [
    "**3. 优势函数 A(s,a)：**\n",
    "- 定义：A(s,a) = Q(s,a) - V(s)\n",
    "- 含义：评估在状态s下，执行动作a比平均表现好多少\n",
    "- 在滑雪游戏中：\n",
    "```json\n",
    "假设在状态s：\n",
    "V(s) = 15分 (该状态的平均预期收益)\n",
    "\n",
    "各动作的优势值：\n",
    "A(s, 向左转) = Q(s,左转) - V(s) = 10 - 15 = -5\n",
    "- 表示比平均表现差5分\n",
    "\n",
    "A(s, 直行) = Q(s,直行) - V(s) = 20 - 15 = +5\n",
    "- 表示比平均表现好5分\n",
    "\n",
    "A(s, 向右转) = Q(s,右转) - V(s) = 12 - 15 = -3\n",
    "- 表示比平均表现差3分\n",
    "```\n",
    "\n",
    "这三个函数的关系：\n",
    "1. V(s)评估状态的总体价值\n",
    "2. Q(s,a)评估状态-动作对的价值\n",
    "3. A(s,a)评估具体动作相对于平均表现的优劣\n",
    "\n",
    "在PPO算法中：\n",
    "- 使用神经网络估计V(s)\n",
    "- 用优势函数A(s,a)来指导策略更新\n",
    "- 优势值为正的动作会被强化\n",
    "- 优势值为负的动作会被弱化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e6ba6a0",
   "metadata": {},
   "source": [
    "MDP中对应的奖励函数 折扣因子 状态空间以及动作空间的区别是什么\n",
    "1. MDP的基本要素描述了环境：\n",
    "- 定义了问题的框架\n",
    "- 描述了环境的动态特性\n",
    "- 定义了即时奖励规则\n",
    "\n",
    "2. 价值函数是基于MDP计算出来的：\n",
    "- 用于评估长期收益\n",
    "- 帮助做出决策\n",
    "- 指导策略的学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fac9d888",
   "metadata": {},
   "source": [
    "## 2.4 策略梯度方法"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0bcad61e",
   "metadata": {},
   "source": [
    "\n",
    "- 策略参数化：如何用神经网络表示策略\n",
    "- 目标函数：最大化期望回报\n",
    "- 策略梯度定理：如何计算梯度"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4b544b0",
   "metadata": {},
   "source": [
    "1. 策略参数化：\n",
    "- 定义：使用神经网络来表示策略π(a|s;θ)，θ是网络参数\n",
    "- 含义：在状态s下选择动作a的概率\n",
    "\n",
    "```json\n",
    "    例如滑雪游戏中：\n",
    "    输入状态s：\n",
    "    - 位置坐标(x,y)\n",
    "    - 速度v\n",
    "    - 距离最近障碍物距离d\n",
    "    - 到旗门距离g\n",
    "\n",
    "    神经网络输出动作概率：\n",
    "    π(左转|s;θ) = 0.2\n",
    "    π(直行|s;θ) = 0.3\n",
    "    π(右转|s;θ) = 0.5\n",
    "\n",
    "    这里的θ包含神经网络的所有权重和偏置参数\n",
    "\n",
    "    输入层(状态s)：\n",
    "    - 节点1：x坐标\n",
    "    - 节点2：y坐标\n",
    "    - 节点3：速度\n",
    "    - 节点4：到树的距离\n",
    "\n",
    "    隐藏层：\n",
    "    - 权重W1：连接输入层到隐藏层的权重矩阵\n",
    "    - 偏置b1：隐藏层的偏置项\n",
    "\n",
    "    输出层(动作概率)：\n",
    "    - 权重W2：连接隐藏层到输出层的权重矩阵\n",
    "    - 偏置b2：输出层的偏置项\n",
    "\n",
    "    θ就是所有这些参数的集合：θ = {W1, b1, W2, b2}\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47e52d46",
   "metadata": {},
   "source": [
    "2. 目标函数：\n",
    "- 定义：J(θ) = E[R₁ + γR₂ + γ²R₃ + ...]\n",
    "- 含义：在当前策略参数θ下，期望能获得的长期回报\n",
    "\n",
    "```json\n",
    "例如一个回合的轨迹：\n",
    "t=1: 右转，通过旗门，R₁=10\n",
    "t=2: 直行，收集金币，R₂=2\n",
    "t=3: 左转，避开树，R₃=5\n",
    "\n",
    "假设γ=0.9，则该轨迹的回报：\n",
    "R = 10 + 0.9×2 + 0.9²×5 = 14.05\n",
    "\n",
    "目标是最大化多个轨迹的期望回报\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b6b168f",
   "metadata": {},
   "source": [
    "3. 策略梯度定理：\n",
    "- 定义：$\\nabla_{\\theta} J(\\theta) = \\mathbb{E}\\left[ \\nabla_{\\theta} \\log \\pi(a|s;\\theta) \\times Q(s,a) \\right]$\n",
    "- 含义：告诉我们如何调整参数θ来提高策略性能\n",
    "\n",
    "```json\n",
    "    计算步骤示例：\n",
    "    假设在某个状态s下：\n",
    "    1. 当前策略输出的概率：\n",
    "    - 左转：0.3\n",
    "    - 直行：0.5\n",
    "    - 右转：0.2\n",
    "\n",
    "    2. 策略梯度告诉我们：\n",
    "    ∇θ = 对参数θ求导\n",
    "        log(π(a|s;θ)) = 动作概率的对数\n",
    "        Q(s,a) = 在状态s下采取动作a的价值\n",
    "    - 如果Q值为正，应该增加这个动作的概率\n",
    "    - 如果Q值为负，应该减少这个动作的概率\n",
    "    假设：  \n",
    "        如果Q(s,左转)=10 (好的结果)\n",
    "        则增加π(左转|s;θ)的概率\n",
    "\n",
    "        如果Q(s,直行)=-5 (坏的结果)\n",
    "        则减少π(直行|s;θ)的概率\n",
    "\n",
    "    4. 更新后的概率可能变成：\n",
    "    - 左转：0.4 (因为效果好，概率增加)\n",
    "    - 直行：0.4\n",
    "    - 右转：0.2\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94d0c3a7",
   "metadata": {},
   "source": [
    "4. 实际应用过程：\n",
    "```json\n",
    "    训练循环：\n",
    "    1. 使用当前策略π(a|s;θ)进行滑雪\n",
    "    2. 收集状态-动作-奖励序列\n",
    "    3. 计算每个状态-动作对的Q值\n",
    "    4. 使用策略梯度定理计算梯度\n",
    "    5. 更新策略参数θ\n",
    "    6. 重复这个过程\n",
    "```\n",
    "如果某个动作带来了好的回报：\n",
    "- 其对应的概率会被增加\n",
    "- 例如：如果右转后成功通过旗门\n",
    "- 在类似状态下右转的概率会增加\n",
    "\n",
    "\n",
    "5. 关键点：\n",
    "- 策略网络直接输出动作概率\n",
    "- 通过实际尝试来评估动作的好坏\n",
    "- 根据回报来调整动作概率\n",
    "- 逐步改进以获得更好的策略"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd14fc2c",
   "metadata": {},
   "source": [
    "# 3.PPO核心概念"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a8f34a9",
   "metadata": {},
   "source": [
    "## 3.1 Actor-Critic基础架构"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "584933a0",
   "metadata": {},
   "source": [
    "1. 基本概念：\n",
    "Actor-Critic = Actor(演员) + Critic(评论家)\n",
    "\n",
    "就像滑雪训练：\n",
    "- Actor就是滑雪者，负责执行动作\n",
    "- Critic就是教练，负责评估表现"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65d23d36",
   "metadata": {},
   "source": [
    "2. Actor(策略网络)详解：\n",
    "\n",
    "输入层：状态信息\n",
    "- 位置坐标(x,y)\n",
    "- 当前速度\n",
    "- 前方障碍物位置\n",
    "- 到旗门距离\n",
    "\n",
    "隐藏层：特征提取\n",
    "- 处理输入信息\n",
    "- 学习状态特征\n",
    "\n",
    "输出层：动作概率分布    \n",
    "π(a|s) 表示在状态s下选择动作a的概率\n",
    "例如：\n",
    "- 左转: 0.7\n",
    "- 直行: 0.2\n",
    "- 右转: 0.1\n",
    "\n",
    "Actor的工作：\n",
    "1. 观察当前状态\n",
    "2. 输出动作概率\n",
    "3. 根据概率选择动作\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "795cc968",
   "metadata": {},
   "source": [
    "3. Critic(价值网络)详解：\n",
    "  \n",
    "输入层：与Actor相同的状态信息\n",
    "- 位置坐标(x,y)\n",
    "- 当前速度\n",
    "- 前方障碍物位置\n",
    "- 到旗门距离\n",
    "\n",
    "隐藏层：特征提取 \n",
    "- 处理输入信息\n",
    "- 学习状态价值特征\n",
    "\n",
    "输出层：单个价值估计V(s)\n",
    "- 预测从当前状态开始能获得的总回报\n",
    "例如：     \n",
    "V(s) = 25分，表示预计从当前状态开始能得到25分\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "030c8268",
   "metadata": {},
   "source": [
    "4. 两者如何协同工作：\n",
    "\n",
    "步骤1 - 状态观察：\n",
    "- Actor和Critic都接收当前状态\n",
    "- 例如：看到前方有树\n",
    "\n",
    "步骤2 - 各自工作：   \n",
    "Actor：\n",
    "- 输出动作概率[0.7, 0.2, 0.1]\n",
    "- 选择左转(概率0.7最高)\n",
    "\n",
    "Critic：\n",
    "- 评估当前状态价值为25分\n",
    "- 实际执行后得到30分\n",
    "- 计算优势：30 - 25 = +5\n",
    "\n",
    "步骤3 - 学习更新：\n",
    "Actor根据优势更新：\n",
    "- 优势为正(+5)\n",
    "- 增加选择左转的概率\n",
    "- 因为结果比预期好\n",
    "\n",
    "Critic更新：\n",
    "- 调整价值预测\n",
    "- 使预测更准确\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a2c3f32",
   "metadata": {},
   "source": [
    "5. 在PPO中的应用：\n",
    "\n",
    "1. 数据收集：\n",
    "- Actor与环境交互\n",
    "- 收集(状态,动作,奖励)\n",
    "\n",
    "2. 优势计算：\n",
    "- Critic评估状态价值\n",
    "- 计算实际回报与预测的差\n",
    "\n",
    "3. 策略更新：\n",
    "- 使用PPO的裁剪目标函数\n",
    "- 同时更新Actor和Critic"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19b95ad5",
   "metadata": {},
   "source": [
    "## 3.2重要性采样"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a14276d",
   "metadata": {},
   "source": [
    "1. 基本概念：\n",
    "\n",
    "重要性采样是用A策略收集的数据来评估B策略的方法     \n",
    "关键公式：重要性权重 = 新策略概率/旧策略概率\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bab9e145",
   "metadata": {},
   "source": [
    "首先理解PPO的一个重要特点：\n",
    "```json\n",
    "PPO不是这样训练的：\n",
    "收集数据 → 更新一次 → 收集新数据 → 更新一次 → ...\n",
    "\n",
    "而是这样的：\n",
    "收集一批数据 → 用这批数据更新多次 → 再收集新数据 → 再更新多次 → ...\n",
    "\n",
    "```\n",
    "假设我们收集了一批数据：\n",
    "- 用策略A收集的\n",
    "- 策略A说：\"看到树时，30%概率左转\"\n",
    "- 实际左转了，得到10分\n",
    "\n",
    "第一次更新后：\n",
    "- 策略变成了策略B\n",
    "- 策略B说：\"看到树时，40%概率左转\"\n",
    "- 但我们手里的数据还是用30%概率收集的\n",
    "\n",
    "想象成考试：\n",
    "- 策略A：选择A答案的概率30%\n",
    "- 选了A，得了10分\n",
    "\n",
    "现在我们的策略变了：\n",
    "- 策略B：选择A答案的概率40%\n",
    "- 但我们还在用策略A时的那次考试成绩\n",
    "- 这个10分对策略B来说准确吗？"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f51749aa",
   "metadata": {},
   "source": [
    "\n",
    "第一轮收集数据：\n",
    "状态：看到树\n",
    "动作：左转(30%概率)\n",
    "结果：+10分\n",
    "\n",
    "第一次更新后：\n",
    "- 策略变成40%概率左转\n",
    "- 调整分数：10 × (40%/30%) = 13.33分\n",
    "- 说明这个动作不错，应该增加概率\n",
    "\n",
    "第二次更新：\n",
    "- 策略变成45%概率左转\n",
    "- 调整分数：10 × (45%/30%) = 15分\n",
    "- 继续增加概率\n",
    "\n",
    "第三次更新：\n",
    "- 策略变成48%概率左转\n",
    "- 调整分数：10 × (48%/30%) = 16分\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02bc6f40",
   "metadata": {},
   "source": [
    "最终效果：\n",
    "```json\n",
    "不是选择某一次更新的结果\n",
    "而是通过多次更新得到一个更好的策略\n",
    "\n",
    "例如：\n",
    "初始策略：30%左转\n",
    "↓ 第一次更新\n",
    "40%左转\n",
    "↓ 第二次更新\n",
    "45%左转\n",
    "↓ 第三次更新\n",
    "48%左转\n",
    "\n",
    "最终使用最后更新的策略继续收集新数据\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dafe1acc",
   "metadata": {},
   "source": [
    "更新多次的意义：\n",
    "```json\n",
    "1. 逐步优化：\n",
    "   - 不是一次性大幅改变策略\n",
    "   - 而是小步慢走，逐渐改进\n",
    "   \n",
    "2. 数据充分利用：\n",
    "   - 每次更新都能从数据中学到东西\n",
    "   - 就像反复研究同一场比赛的录像\n",
    "   \n",
    "3. 稳定性：\n",
    "   - 防止策略突变\n",
    "   - 保持学习的连续性\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50760d81",
   "metadata": {},
   "source": [
    "## 3.3 裁剪功能"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a5112b0",
   "metadata": {},
   "source": [
    "为什么需要裁剪：\n",
    "\n",
    "不裁剪的问题：   \n",
    "如果新策略概率可以无限制变化：\n",
    "- 可能从30%直接变到90%\n",
    "- 或者从30%直接降到5%\n",
    "- 学习过程不稳定\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "523f5236",
   "metadata": {},
   "source": [
    "裁剪机制：\n",
    "\n",
    "设置裁剪范围：[1-ε, 1+ε]    \n",
    "通常ε = 0.2，所以范围是[0.8, 1.2]\n",
    "\n",
    "例如：\n",
    "旧概率：30%\n",
    "允许的新概率范围：\n",
    "- 上限：30% × 1.2 = 36%\n",
    "- 下限：30% × 0.8 = 24%\n",
    "\n",
    "如果计算出新概率45%：\n",
    "- 超过了36%\n",
    "- 会被裁剪到36%\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ded99730",
   "metadata": {},
   "source": [
    "裁剪的作用：\n",
    "\n",
    "1. 防止策略突变   \n",
    "2. 保持学习稳定性   \n",
    "3. 保留已学到的好的经验    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdc71f95",
   "metadata": {},
   "source": [
    "为什么不一步到位：\n",
    "\n",
    "假设当前状态：看到树    \n",
    "旧策略：30%概率左转，得10分    \n",
    "\n",
    "如果直接更新到最大值(1.2倍)：\n",
    "- 新概率 = 36%(1.2 × 30%)\n",
    "- 看起来合理\n",
    "\n",
    "但实际情况可能是：\n",
    "- 32%时效果最好，得15分\n",
    "- 34%时开始下降，得12分\n",
    "- 36%时可能只有8分\n",
    "\n",
    "所以需要渐进式尝试：    \n",
    "第1次：31% → 观察效果   \n",
    "第2次：32% → 效果更好    \n",
    "第3次：33% → 效果开始下降    \n",
    "停在32%，而不是盲目到36%   \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8448077",
   "metadata": {},
   "source": [
    "为什么概率越高可能效果下降：\n",
    "\n",
    "在滑雪游戏中：    \n",
    "状态：看到前方有树，且左侧有旗门    \n",
    "\n",
    "如果左转概率太低(20%)：\n",
    "- 经常错过避开树的机会\n",
    "- 容易撞树\n",
    "\n",
    "如果左转概率适中(32%)：\n",
    "- 能较好地避开树\n",
    "- 还能照顾到旗门的收集\n",
    "- 平衡了安全和得分\n",
    "\n",
    "如果左转概率太高(40%)：\n",
    "- 过于倾向左转\n",
    "- 可能过早转向错过旗门\n",
    "- 或者转向过度失去平衡\n",
    "- 反而表现变差\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14c34e7a",
   "metadata": {},
   "source": [
    "PPO的核心思想：\n",
    "\n",
    "1. 保守原则：\n",
    "   - 宁可小步慢走\n",
    "   - 不要冒进冒险\n",
    "\n",
    "2. 探索和利用的平衡：\n",
    "   - 不断尝试略微不同的策略\n",
    "   - 但不会偏离太远\n",
    "\n",
    "3. 安全更新：\n",
    "   - 有多重保护机制\n",
    "   - 防止策略突变\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7e6a6ae",
   "metadata": {},
   "source": [
    "## 3.4 KL散度"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcb2218f",
   "metadata": {},
   "source": [
    "1. 基本概念：\n",
    "\n",
    "KL散度用来衡量两个概率分布的差异程度    \n",
    "在PPO中：\n",
    "- 比较新策略和旧策略的概率分布\n",
    "- 确保它们不会差得太远\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "024ee7f8",
   "metadata": {},
   "source": [
    "1. 裁剪和KL散度监控的不同点：\n",
    "\n",
    "裁剪方法只关注单个动作：\n",
    "状态：看到树\n",
    "旧策略：\n",
    "- 左转 30%\n",
    "- 直行 50%\n",
    "- 右转 20%\n",
    "\n",
    "裁剪限制：\n",
    "- 左转：只能在24%-36%之间\n",
    "- 直行：只能在40%-60%之间\n",
    "- 右转：只能在16%-24%之间\n",
    "\n",
    "但是！即使每个动作都在限制范围内：\n",
    "新策略：\n",
    "- 左转：36%(上限)\n",
    "- 直行：40%(下限)\n",
    "- 右转：24%(上限)   \n",
    "整体策略的变化可能已经很大了\n",
    "\n",
    "KL散度会计算这两个分布的差异\n",
    "- 差异小说明策略变化温和\n",
    "- 差异大说明策略变化剧烈\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a1420a6",
   "metadata": {},
   "source": [
    "KL散度作用：\n",
    "\n",
    "裁剪方法的局限：\n",
    "- 只能逐个限制动作概率\n",
    "- 看不到整体策略变化\n",
    "\n",
    "KL散度的价值：\n",
    "- 提供整体策略变化的度量\n",
    "- 防止多个\"合法\"的小变化\n",
    "- 累积成不稳定的大变化\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "155f11f8",
   "metadata": {},
   "source": [
    "# 4.PPO核心公式讲解"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82e7dbba",
   "metadata": {},
   "source": [
    "#### 1. **策略比率** $ r_t(\\theta) $\n",
    "\n",
    "$$\n",
    "r_t(\\theta) = \\frac{\\pi_\\theta(a_t | s_t)}{\\pi_{\\theta_{\\text{old}}}(a_t | s_t)}\n",
    "$$\n",
    "\n",
    "- $ r_t(\\theta) $ 是 **策略比率**，它表示当前策略 $ \\pi_\\theta $ 与旧策略 $ \\pi_{\\theta_{\\text{old}}} $ 对于某个动作 $ a_t $ 在状态 $ s_t $ 下的概率比率。\n",
    "- 也就是说，$ r_t(\\theta) $ 衡量了当前策略在给定状态下选择某个动作的概率与旧策略选择该动作的概率之间的比率。\n",
    "```json\n",
    "    在滑雪游戏中：\n",
    "    状态st：看到前方有树\n",
    "    动作at：选择左转\n",
    "    πθ_old(at|st)：旧策略选择左转的概率 = 30%\n",
    "    πθ(at|st)：新策略选择左转的概率 = 45%\n",
    "```\n",
    " $ r_t$ (θ) = 45% / 30% = 1.5 \n",
    " \n",
    "  - 如果 $ r_t(\\theta) > 1 $，说明新策略相较于旧策略更加倾向于选择这个动作。\n",
    "  - 如果 $ r_t(\\theta) < 1 $，说明新策略选择这个动作的概率较低。\n",
    "- **目的**：通过调整 $ r_t(\\theta) $ 来最大化优势函数 $ \\hat{A}_t $，即选取能够提升长期回报的动作。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "206f73dd",
   "metadata": {},
   "source": [
    "#### 2. **优势函数** $ \\hat{A}_t $\n",
    "\n",
    "- $ \\hat{A}_t $ 是 **优势函数**，它衡量了在某一状态 $ s_t $ 下，选择动作 $ a_t $ 带来的实际回报与期望回报的差异。通常，优势函数是基于 **TD误差**（Temporal Difference Error）或 **GAE（Generalized Advantage Estimation）** 来估算的。\n",
    "- 具体来说，优势函数可以定义为：\n",
    "  $$\n",
    "  \\hat{A}_t = Q(s_t, a_t) - V(s_t)\n",
    "  $$\n",
    "  其中，$ Q(s_t, a_t) $ 是 **动作价值函数**，表示在状态 $ s_t $ 下选择动作 $ a_t $ 的期望回报；$ V(s_t) $ 是 **状态价值函数**，表示在状态 $ s_t $ 下的期望回报。\n",
    "\n",
    "```json\n",
    "  在滑雪游戏中：\n",
    "    Q(st,at)：选择左转的预期总回报 = 25分\n",
    "    V(st)：当前状态的平均预期回报 = 20分\n",
    "\n",
    "    Ât = 25 - 20 = +5\n",
    "\n",
    "    含义：\n",
    "    - 正优势(+5)：说明左转比平均表现好\n",
    "    - 负优势：说明这个动作比平均表现差\n",
    "```\n",
    "- **目的**：优势函数的作用是引导策略更新的方向。正的优势函数值意味着当前的动作比平均策略更好，负的优势函数值则意味着当前的动作不理想。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cf19e9e",
   "metadata": {},
   "source": [
    "#### 3. **剪切函数** $ \\text{clip}(r_t(\\theta), 1-\\epsilon, 1+\\epsilon) $\n",
    "\n",
    "$$\n",
    "\\text{clip}(r_t(\\theta), 1-\\epsilon, 1+\\epsilon)\n",
    "$$\n",
    "\n",
    "- 这是 **剪切（clip）函数**，它确保策略比率 $ r_t(\\theta) $ 不会发生过大的变化。\n",
    "- **剪切机制**的核心思想是：如果 $ r_t(\\theta) $ 超出了 $ [1-\\epsilon, 1+\\epsilon] $ 的范围，则将其“剪切”回这个区间。这意味着，PPO控制策略更新的幅度，不允许策略发生剧烈变化。\n",
    "  - 如果 $ r_t(\\theta) $ 落在 $ [1-\\epsilon, 1+\\epsilon] $ 范围内，则不做任何修改，保持原有的比率。\n",
    "  - 如果 $ r_t(\\theta) $ 超出了这个区间，剪切函数将其限制在最大值 $ 1+\\epsilon $ 或最小值 $ 1-\\epsilon $ 上。\n",
    "- **目的**：通过限制 $ r_t(\\theta) $ 的变化幅度，PPO确保每次更新不会偏离原始策略太远，从而避免了过大的策略更新导致训练不稳定。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50a4aa2e",
   "metadata": {},
   "source": [
    "#### 4. **最终的目标函数**\n",
    "\n",
    "$$\n",
    "L^{CLIP}(\\theta) = \\mathbb{E}_t \\left[ \\min \\left( r_t(\\theta) \\hat{A}_t, \\text{clip}(r_t(\\theta), 1-\\epsilon, 1+\\epsilon) \\hat{A}_t \\right) \\right]\n",
    "$$\n",
    "\n",
    "- 这是PPO的**目标函数**，它由两个部分组成：\n",
    "  - $ r_t(\\theta) \\hat{A}_t $ 部分：直接使用当前策略比率和优势函数来优化策略。\n",
    "  - $ \\text{clip}(r_t(\\theta), 1-\\epsilon, 1+\\epsilon) \\hat{A}_t $ 部分：通过剪切机制限制策略比率的变化，从而防止过大的更新。     \n",
    "  \n",
    "具体计算：    \n",
    "$r_t$ (θ) = 1.5    \n",
    "Ât = 5    \n",
    "ε = 0.2   \n",
    "\n",
    "第一部分：$r_t$ (θ)Ât   \n",
    "= 1.5 × 5 = 7.5   \n",
    "\n",
    "第二部分：clip($r_t$ (θ), 1-ε, 1+ε)Ât   \n",
    "= clip(1.5, 0.8, 1.2) × 5   \n",
    "= 1.2 × 5 = 6   \n",
    "\n",
    "最终：min(7.5, 6) = 6   \n",
    "- **优化过程**：PPO的优化目标是最大化这个目标函数，具体地，选择一个使得目标函数值最大的策略参数 $ \\theta $，以便模型能在环境中获得最大的长期回报。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53281869",
   "metadata": {},
   "source": [
    "# 5.PPO代码实现"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f54ac863",
   "metadata": {},
   "source": [
    "pip install gymnasium torch numpy==1.24.3 matplotlib"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63427153-f23e-48dd-a8e7-1e8b181cdb59",
   "metadata": {},
   "source": [
    "可能会缺 pip install \"gymnasium[classic-control]\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ba82604f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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7wAAgLJYE1Dre4SuRNeJpS5Wu++++8wiMD0e6TGmpIVaJdHSaHpM1RJtetzVibq+npZ7feqpp8z3CV2gNm/evGLHer1Nj+GDBw/26f3psVgn1FpGVsu26fvU96fHcp1YW6/7z3/+09yv71uPo/rdScev7/+GG24w++j3GX2Mfv/R47Qeo/U7hX427gvqAACoTpoNrsc3nUfrccqigfDPP//czB31xLLOvcszZ60oDYLrSWmdy+rxVU/iv/rqq7JhwwYzZ/W1fOuXX35pAvodOnQwC/71PIUucNO5uQa9rUB9WcfunJwcU2FO5+N//OMfTXD8wIED8sknn5jzG7rIHwCAQFAb5+5W4FoXpttpHEPn7Pr9Ro/Vmhym3130+HzppZeafd5++23zGQwYMMCMWdnjAO70+8Ljjz8uw4cPN1nq27ZtM+Xpv//++0r5bgJUGQcQxObMmePQ/w08bVFRUc79du3aZW6rU6eOY//+/c7b16xZY26fOHGi87ZHH33U3GZ56aWXzPUjR46UOI6pU6eafd555x3nbTk5OY7Bgwc7YmNjHampqea2jz76yOz37LPPOvfLy8tznHPOOeZ2fT+WCy64wNGzZ09HVlaW87aCggLHWWed5TjttNPK/Gz0+caNG2fGffjwYce6descF198sbn9ueeec+739ttvO0JDQx3ffPONy+Nnzpxp9v3222/N9e+//95cX7Rokbn+008/mevXXHONY+DAgc7HXX755Y6+ffs6r+v48/PzXZ5bfx/6+3niiSecty1fvtw8X4cOHRwZGRku+/fp08fRvHlzR3JysvO2L774wuzftm1b52333HOPIy4uznymAAB4+z3iyy+/NMfLffv2Od59911HQkKC8zvDxo0bzT633367y2Pvv/9+c/uyZcuct5177rlmc//+YT++Dx061FGvXj3Hnj17XJ5Pj/GWyZMnm+Ok/binx/Lw8HDzPaU01vF0wYIFJe5z7733mn3sx/6TJ0862rdv72jXrp3zuH3FFVc4evToUerrxcfHO+6+++5S9wEAwB90XqjzSJ2Xe5rrfv755+Was3o6rrsf+y1jxoxxmavqMVcfO2/ePJf9Fi9e7PF2d9Z5itLOS+i8uUmTJo5jx445b/vxxx/NfP+WW27x+ti9YcOGMr9LAABQnWrz3H327NnmPR08eNB8L+jUqZMjJCTEsXbtWpf93c+Xa+zh9NNPd5x//vkut9etW9d8DynpM9T3ao0zMjLScdFFF7l8D3r11Ved4wICFaXUARGZPn26yRa2b1YpbzvNttYMbIuunho4cKAsWrSoxOfW8mNKs6U1u9oTfbyuorb3MtEVVboKPC0tTb766ivnftq/XFdgWbS3h67CttMV7FoCTUu1aIa7ZsPrpiu5deW2ljXTFdtlmTVrlin1oqXRtPSplpHTEumTJk1y7qOZ7Zol3rVrV+fr6GaVotGyMKpv376mrNzXX3/tzAzXjG3t16arzzXrTOPxutLcKvmiNMPe6hGen59v3oNVjt5TmVXNntdV+5ZDhw7Jxo0bze32lela6k1Xt7v/rrRcjP7+AQDwlq6O1uOlrvbWMqF6nNLV5PqdwfqOYD92Kl19rjyVHy/JkSNHzHH0tttukzZt2rjcZ2/josdWzdKyl0V77733TFm4m266SXyl70m/A2mbGIu+Z11RrqvTNTvOOq7u37/frBYvie6jq/APHjzo87gAAKhMOtfW47qWMbWXDdXyploxTiuNVWTOWhE679b5rM5j7fNuLYOqr2XNuyvKmjdr1Tptk2LRynf6mvZzHmUdu615t2bV6zwfAIBAURvn7voa+p60Qs3FF19sKr5q5veZZ57psp/9fLlWhNX99Bx8Rb+raKUZzTzX9irW9yA1fvx4Uy22PJ8XUN0IjANFAW49MNq38847r9h+p512WrHbOnfuXKy3ht21115rSo9pGRKdPOtBV0ux2YPke/bsMc9tP4goDThb91uXzZs3NwdtO51w22lJdg0y/+1vfzMHRvumvcCVpz5p7rRsuwaJ9UBm9U7Xia19nBpk19Jx7q+jn4v9dfSkgpZ/0YC40ks9+OpJdT158N1335kT6RrUtwfG9XPSsuz6+egJB+1xrs+v5Wg89SfT0nV21mfn6Xfn/rn94Q9/MOPW8nEatNcvFosXLy7zcwIABDdrgZ2elNZjmbYB0YVo1nFIj5udOnVyeYwuiNMTy9Zxyhv6vOr0008vdT9drKaTYC2/ZtGftQ+4+zgqQsfsfgz19L3lL3/5i/nOot+z9DisrWjsrWTUs88+K5s2bTInJnQ//b5hvU8AAPxNy41awXClC750Lqvzep3jVmTOWhE679bn0kXr7nNvXUzvzfy+NNaxu6TjuwbhdRG5N8dunZNrUOHNN980n4V+J9LvSvQXBwD4W22cuz/yyCPmPWmAXwPterx1jzEoLZmuzxsdHW0Wwel3CC17XtHjc0nfHbStqbZlKc/nBVQ3eowDVUxXY+kKMT3gaoBZA6268kszqrX3tTWZrkxW0F37bFsHd3feHFw1OKyLBNTIkSPNpFb7iOmigVGjRjlfq2fPnvLiiy96fA6dLFs0CK49VLTHqJ5MeOihh8wXC/2SoNetPu32wPjTTz9tAvwapNb+4Xrg1oO7rkbzlIFvX/1WXnqSQVfJ68p2rRig25w5c8yXCu0vAwCAJ3pSWCurlMa+Krw66LFL+3rrCXxdga4L0LQPaXXSE+naY0wn4Pr958MPP5QZM2aYibv2IVNa3UaP+zqJ1+9Fzz33nDzzzDOycOFCs1ANAAB/0oxsPWn973//W/7617+aS12EbgXMKzJndf9+UNjJzJUuHrfT59H5qv3EuZ2e3K4u3hy7X3jhBZN9rpXzdB+thqc9WvX7iJ5nAADAH2rj3F3Py1vn77XarSa1ada2noe3zsvreXftLz506FAzJ9fEO61Wq+e9rcV/QDAhMA6Uc5W2u19//VXatWtX6uN0Uqxl1nTTALJOnDUorMFyPXC1bdvWrCbXya59RdfWrVvNpd5vXWo5c10Rbs8a15POdroqS+kBzjowVobf//73ZiX8ww8/LFdddZX5otCxY0f58ccfzXsr64uDTp61xIqeTNBS7lYAXA/KVmBcM7atALnSUjIaiNey7nbJyckmUF8W67Pz9Ltz/9ysVW2XXXaZ2fT3oVnkr7/+ujnRURlZdgCA4KLHIT2e6HHIyqhWSUlJ5lhmHae8YR3fNUurLJrJptlaeszNzMw03wm0ik1l0DF7Ooa6f29RdevWNa+rm34H0IV1ukhu8uTJZqW60km5Hm9104y3M844w+xDYBwAEAg0CK7zQZ2z68ljzQy3lyf1Zc7aoEEDj5VS3LOsdN6tJUu1Gp0vi8FLYh27Szq+6/vQY7rFm2O3nqjXTc8frFq1yox95syZ8uSTT1b6+AEA8FVtmbv/4x//MIvX9Lisx12li9R1/q3JYFrdxqKB8YouDLB/d7Der9J5/65duyo1JgFUNkqpA+Xw0UcfufTmXrt2remtVdqJWy0N7q5Pnz7mUleBWdnYiYmJJpPcor1EXnnlFRMAP/fcc5376e1a5sS+klz3s9OV5MOGDTMBXe0V5qnPSUVof3Ptq7Jlyxaz8ttaLa6fyT//+c9i++vB3Cq3prQfux7cdTW5rqLv0aOHuV0D5LoaTnup27PFlWbUu6+g1/5q3vRItybs+nlrxre9NIyWmLF6oFq0F5ydLlLQnmr23xUAAOWhx241depUl9utSiuXXnqp18+l2WC6mGz27Nmyd+9el/vcj5V6Alu/n7zzzjsmu0x7jXmzoMzb96TfgbTnqkWP92+88YZZLNi9e3ePx1VdfKb36Vhzc3PNdxj3sm36HUZ7o3HcBQAECis7XCueaIUxe7a4r3NWDXhr4Nk+R9eF5+6tR3TercdNzUh3p+cI9IS9L+zzZvtz6Ql9zfi2vs94c+xOTU01Y7LTALnOrzm+AwACVW2Zu+t3i9GjR8vcuXNNvMH6rqIBb3tFGm0Nq7EOd7oQzpvvFRr41jn+yy+/7PKedKGgflcoz+cFVDcyxgERUzLbynKyO+uss1xWPGnGsJYhueuuu8yETg+UCQkJ8sADD5T43E888YQppa4HA11JpauptWSJlg/T51J33HGHCWJrqbH169ebk8q66lwnw/oa9erVM/tpFrOusn7wwQfNwUtPLmu5Mk+9QLRnij6/TkC1fIq+D13hpiextTSLTrYrQseoJwQ0uK3lWW6++WbTM/3OO+80GfA6Pj3I6uept+tKNKtETUxMjClFp0FwfS/WCjT9oqAn1HVzD4z/7ne/M5/h2LFjze/j559/Nl8S7L+XsmjJNv389fPQ8na6WEEXE2hgXrPvLdoHXu/TMvf6+9FV+rqfniCwrxQEAMBbvXv3ljFjxpigsU4udbGbBpX1xLMeRzXDrDx00qnHM83M0u8P2sdTvxNouxY9We9eku3qq682P3s6kV4aXVHu6buRvhf9HqKr2XXyrqVRdbGbvh9dFa6Ps6rfXHTRRaYfm3430GowurBOS8LpMVm/2+jnocdbHaN+TroYULPhvv/+e1OCFQCAQKDHWp2LWovD3QPjvsxZdX6qJ9y1Bdq4cePM+QLN7tK5qgaYLfr9QSu46dxWj/d6jNVF55rVpkH4adOmOY/5pdHX0nm5nR63tUy8lkTXY/vgwYPNWHShu86H4+PjTR9xdfLkyTKP3cuWLTMt2K655hpTEU6D5G+//bY5Ka8n6gEACEQ1de7uyZ///GdzXl7jCppBrnNw/Q6gQfcbbrjBfN/Q2IHGOrQijp2eu9dju+6vC9903Jrs5in4r5XgtE2aPq+WatfscY17aGWdm266yef3AVQZBxDE5syZo8uZStz0frVr1y5z/bnnnnO88MILjtatWzuioqIc55xzjuPHH390ec5HH33U7GtZunSp44orrnC0aNHCERkZaS6vv/56x6+//uryuKSkJMfYsWMdjRo1Mvv17NnT+fp2x44dc9x8882OuLg4R3x8vPl5w4YNLuO17Nixw3HLLbc4mjVr5oiIiHC0bNnS8bvf/c7xwQcflPnZ6PPdfffdHu977LHHzP3Lly8313NychzPPPOMo0ePHuZzadCggaNfv36Oxx9/3JGSkuLy2D//+c/msbq/XadOncztOma7rKwsx3333edo3ry5o06dOo4hQ4Y4Vq9e7Tj33HPNZtGx6OMXLFjgccwffviho1u3bmZ83bt3dyxcuNAxZswYR9u2bZ376Ody0UUXOZo0aWJ+B23atHH8/ve/dxw6dKjMzwsAELzfI77//vtS98vNzTXHxPbt25vjsX6PmDx5sjnG2bkf26zvH+7H902bNjmuuuoqR/369R3R0dGOLl26OP72t78Ve93s7GxzTNbvC5mZmV69J+t4WtL2zTffmP30eH311Vc7xzBgwADHJ5984vJcr7/+umPo0KGOhIQEc/zt2LGj+R5gfTfQ8en13r17O+rVq+eoW7eu+XnGjBlejRUAgOoyffp0cxzU4507b+esJR3X33nnHUeHDh3MHLRPnz6Ozz//vNhc1fLGG2+Yuba+jh479bzBAw884Dh48GCp47fOU3jawsLCnPt9+eWXZvz6/HrO4bLLLnP88ssvzvu9OXbv3LnTcdttt5njvn5HaNiwoeO8884zzw0AgD/U5rl7SefChw0bZo7lycnJ5vqsWbMcp512mpmbd+3a1YzVPY6htm7daubx+l1A79PvJPbPUN+r3auvvmqeTz+vpk2bOu666y7HiRMnvHoPgL+E6H+qLuwO1A66mktXR+kK6vvvv9/fwwEAACiTZmjpCm+t0uLe9xQAAAAAAPgfc3egetFjHAAAAKiFtF+Y9izVsmwAAAAAACDwMHcHqhc9xgEAAIBaZM2aNaZPmPYm69u3r+mNBgAAAAAAAgdzd8A/yBgHAAAAapHXXntN7rrrLmnSpIm89dZb/h4OAAAAAABww9wd8A96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m5w4caLC7wmoSU5m5cr05dvl7GeWy+P/+8UExWMiw2TM4Lby9Z/Pk2eu7iUDOyQQFAeASgiM57OQHQAAn3Tp0sUsbv/444/lnXfeMcHxs846S/bv319qiXatGGffAADwNzLGfWBvU6blLwEAqCkSExOlSZMmLreFh4dLw4YNzX0lPUaD2RpQt2vatGmJjynpedq3b1/sOaz7GjRoUOKkWjcLk2rURNl5+fLmN7vk9a92SGpWnrmtTcMYGT+0g1zZp4XUi47w9xABoNaglDoAAJVj8ODBZrNoUFyrx73++uvy97//3eNjpkyZIo8//ng1jhIAgLKRMe4DezA83x4lBwDATx588EHT96u0bevWrVIT6aRa+5pbW+vWrf09JKBclm89LCNe+lqe+3ybCYp3bFxXXrq2tyy771y5eVBbguIAUMmsohsFzNcBAKhUERER0rdvX9m+fXuJ+0yePNm0ZLO2ffv2VesYAQDwhIxxH9jn1syzAQCB4L777pNbb7211H06dOggzZo1k8OHD7vcnpeXJ8ePHzf3eaK3a2/w5ORkl6zxpKSkEh9T0vPoY+ys66U9j06qJ02a5JIxTnAcNcGB5Ex59OPN8uWWwr/zJvWiZPLIrnJ575bObEYAQOWz2lGwkB0AgMqVn58vP//8s4wcObLEfaKioswGAEAgITDuk1OTa0qzAQACQePGjc1WFi2BpgFu7Rver18/c9uyZctMn7CBAwd6fIzup6vCly5dKqNHjza3aV/wvXv3upRU8+a1H3roIdOvXJ9PLVmyxPQsK6mMumJSjZpYXeiD9ftND/G07DwJDw2RsUPayZ8uOI3scACoBmFFPcaJiwMAgklaWppLJveuXbtk48aNpnVamzZtzKLzAwcOyFtvveXcR++3HnvkyBFzXVupde/e3dz+xBNPyKBBg6RTp07mXMJzzz0ne/bskdtvv90P7xAAgIojMF5pGePMtAEANYf2Arv44otl/PjxMnPmTBOknjBhglx33XXSokULs49OlC+44AIzWR4wYIApXz5u3DiTta0T6ri4OPnjH/9oAt06QbboBFwn09ovPDMz0znB1gm1TqxvuOEG02dMn+svf/mLbNq0SaZNmyYvvfSS3z4PoLIdTcuWvy78Wb74pTBLvG+b+vLM6F7SuWk9fw8NAIJGqDMwznwdABA81q1bJ+edd57zulV5bcyYMTJ37lw5dOiQWeBup2XRLbqAfv78+dK2bVvZvXu3ue3EiRPm/IHO83VBuy6cX7VqlTNwDgBATUFg3Af2uTWl2QAANc28efNMMFyD36GhoSYL/OWXX3ber8FyzQjPyMhw3qbBa2vf7OxsGTFihMyYMcPleXXF+FdffVVsgq2r1Nu1a2cC7F988YXcfffdZjLdqFEjeeSRR+SOO+6olvcNVLUvNifK5IU/y7H0HIkIC5F7h3eW3w/tIOFhof4eGgAEldCif3aZrwMAgsmwYcNM9aqSaHDcXWn7W+cCWMwOAKgNCIz7wL7qnAXoAICaRrO+dRV4STSI7T45jo6OlunTp5utJCtWrCjztXv16iXffPNNOUcMBLbkjBx58tMtpny66tK0nrx4bW/p0SLe30MDgKAUVtRjnIxxAAAAAIAiMO4DMsYBAABQUOCQD37YL//4bKscT88Rrdx7xzkdZOKFnSU6IszfwwOAoEUpdQAAAACAHYFxH9iz6JhoAwAABJ9NB1LkkY83yQ97k831zk1j5amresqZ7Rr6e2gAEPSswHh+gb9HAgAAAAAIBATGfWAPhRMYBwAACK6y6c9/sU3mrdlrqgjFRIbJPRecJred3V4i6CUOAAGBUuoAAAAAADsC4z6wT66ppA4AABAcVm0/KhPf3yhJqdnm+mW9W8hDI7tJs/hofw8NAGBTFBc3LS8AAAAAACAw7gN6jAMAANRe+09kyLrdJ+SXQ6kSHhpieof/tD9FVm4/ar4HdmhUV5686nQ5q2Mjfw8VAFBaKXUyxgEAAAAABMYrM2OciTYAAEBN53A45Nvtx+TNlTtlxbYjJe533Zmt5ZHLuktMJF+nASDgS6mzkB0AAAAAQGDcN/apNXFxAACAmh0Q/++PB+W1FTtka+JJc5smGvZuVV96t4qXkJAQyckvkK7N6smA9g2la7M4fw8ZAOBlxjhxcQAAAACAIjDu4wlUC6XUAQAAaqbfkk7Kwx9tkjW7jpvrdSLC5P/6t5Lbzm4vbRPq+nt4AIAKCi3KGGe+DgAAAABQBMZ9YM8Sp5Q6AABAzZKUmiVTv/xV3vt+n8kmjI4IlT8M6yRjBreT+JgIfw8PAOCjsMK4OPN1AAAAAIBBYNwH9kXnTLQBAABqhtSsXHn9qx0ya+UuycotMLdd2L2pPPK77tK6YYy/hwcAqOSMcebrAAAAAABFYLySSqlTmQ0AACCw5eYXyFur98iry36TExm55rZ+bRvIg5d0lTPbNfT38AAAVdRjPL9wDRQAAAAAIMgRGPeBPRhOzzIAAIDAtf9EhkyYv0E27ks21zs2risPXNxVLureVEKKAicAgNolrOjfdzLGAQAAAAAqlI+hcjLG7T8DAAAgMOh3tP9s2C+XvrzSBMXjosNlyqie8vm9Q2VEj2YExQGgDNOnT5d27dpJdHS0DBw4UNauXVvq/snJyXL33XdL8+bNJSoqSjp37iyLFi0Sv5ZSZyE7AAAAAICMcd/Yp9b5BMYBAADk+93HZfGmRPk16aS5PvS0xjK4Y4Lp3b39cJp8/esR2XwwVXYeSTP3140Kl/7tGsjwbk1lcIcEZxCjMmw6kCLPLN4q3/x21Fzv3bq+vHp9X/qIA4CX3nvvPZk0aZLMnDnTBMWnTp0qI0aMkG3btkmTJk2K7Z+TkyMXXnihue+DDz6Qli1byp49e6R+/fp+Gb91SGG+DgAAAABQBMZ9YC/HVkDPMgAAEMS9u1f+dlRmrdwlK7cXBqEtVlC6ND8fSJE53+6WDo3qynUDWku7hLrSLD5amsVFS6PYqHIHy3/anywvL/1Nvtxy2FyPDA+Vey44Te4Y2kEiwiiYBADeevHFF2X8+PEyduxYc10D5J9++qnMnj1bHnzwwWL76+3Hjx+XVatWSUREhLlNs839JYyMcQAAAACADYFxH9gXndOzDAAABENZ8n3HM2XTwRQJDQmRmMgwWbb1sPzvx4NyLD3H7BMRFiJX9Gkp/ds2kMzcfHP/lkOpcjQtx5QxH9q5sbmvc9N6Eh4WKkdOZstXvx6WzzYlys6j6fL0oq0ur9m4XpRc2rO5XHtma+nWPK7U4PzSLYdl3po9zmC8xkMu791C7hneWdo3qlvFnw4A1C6a/b1+/XqZPHmy87bQ0FAZPny4rF692uNj/vvf/8rgwYNNKfWPP/5YGjduLDfccIP85S9/kbCwsGocfdF4nT3Gq/2lAQAAAAABiMB4ZWWMExgHAAC1OCCugWstS77nWIbHfRLqRsplvVvIuLPbu5QqHzukvblMy86T6PBQEwx3d2mv5vLIZT3kw/X7ZdWOo5KYmi2JKZkmaK7b3FW7zaYB8uHdm0hC3SgTCE/NypVDKVnyy8FUU6I9NSvPGRC/sm9Lufu8TtKxcWyVfS4AUJsdPXpU8vPzpWnTpi636/WtW10XMVl27twpy5YtkxtvvNH0Fd++fbv84Q9/kNzcXHn00Uc9PiY7O9tsltTU1EoPjFNKHQAAAACgCIxXknyWoAMAgFpCe3Nv2HtC4mMi5XBqlskI/3F/ijMjXDO3NdiQnJEjvVrVl6vOaClnd2pUapny2KjSv3bq/WPOamc2S05egazcfkQWrNtvAvOf/nzIbCVpFBspV/drLTcMaCNtEugjDgDVraCgwPQXf+ONN0yGeL9+/eTAgQPy3HPPlRgYnzJlijz++ONVMh7rsEQpdQAAAACAIjDuA3uWOAvQAQBATae9uR/772b5YW9ysfuiwkPl9+d2lDvP7SAxkdXzFVJ7g5/ftanZtiamyr9W7ZF9xzPkaFq2GU9sdLg0jYuWNg1j5JzTGkuf1vWd/WQBAL5p1KiRCW4nJSW53K7XmzVr5vExzZs3N73F7WXTu3XrJomJiaY0e2RkZLHHaKn2SZMmuWSMt27dulLeQ6jVY5wJOwAAAACAwLhv7HNrSrMBAICabOO+ZLn5zTVyMjvPZIUP7thIsnPzTXB6eLemcknPZtKkXrTfxte1WZxMGdXTb68PAMFGg9ia8b106VK58sornRnhen3ChAkeHzNkyBCZP3++2U/7katff/3VBMw9BcVVVFSU2aqCs5R6QZU8PQAAAACghiEw7gN7NTZWoAMAgJqcKX7zrMKg+ID2DeXVG/r6NQgOAAgMmsk9ZswY6d+/vwwYMECmTp0q6enpMnbsWHP/LbfcIi1btjTl0NVdd90lr776qtxzzz3yxz/+UX777Td5+umn5U9/+pNfxh9WFBhnvg4AAAAAUATGfeCwTa4LWIEOAABqoJ/3p8hNmimelScD2jWUObeeKXXL6AcOAAgO1157rRw5ckQeeeQRUw69T58+snjxYmnatKm5f+/evc7McKUl0D///HOZOHGi9OrVywTNNUj+l7/8xS/jt0qp59NjHAAAAABAYNw39kXnrEAHAAA1RVp2nvzjsy2y6UCq/Jp0UjJy8qV/2wYyZyxBcQCAKy2bXlLp9BUrVhS7bfDgwfLdd99JICiKizNfBwAAAAAYnPn0gUNOTa5ZgQ4AAGqCjJw8GTtnrXy/+4TzNg2Kz71tAEFxAECtQil1AAAAAIAdZz8rrce4P0cCAABQtpy8Ahn/1joTFK8XHS5PXNFD2ibUld6t6kuYlVYHAEAtQSl1AAAAAIAdgXEfUEodAADUJFM+2yLfbj8mdSPD5F+3DZAz2jTw95AAAKgy1qIv4uIAAAAAABXKx1Bx9mA4gXEAABDIPvnpoMz5drf5eep1fQmKAwBqPWePcSLjAAAAAAAC476xT60pzQYAAAJValau/HXhz+bnu4Z1lAu7N/X3kAAAqHKhRT3G81nIDgAAAAAgMO4bh21yzTwbAAAEqrdX75HUrDw5rUms3HdhZ38PBwCAakEpdQAAAACAHYFxH9iD4WSMAwCAQJSRkydvfrPT/Hz3eZ0kPIyvfwCA4MoYp5Q6AAAAAED59czolClT5Mwzz5R69epJkyZN5Morr5Rt27a57DNs2DAJCQlx2e68804JBPQYBwAAgW7+mr1yIiNX2ibEyO96Nff3cAAAqDahRRnjLGQHAAAAAPg9MP7VV1/J3XffLd99950sWbJEcnNz5aKLLpL09HSX/caPHy+HDh1ybs8++6wEAnssnMA4AAAINFm5+fLG14XZ4ned25FscQBAUAmzMsaZrwMAAAAARCTcny++ePFil+tz5841mePr16+XoUOHOm+PiYmRZs2aSaBxzRj361AAAACK+WD9fjl8Mluax0fLqDNa+Xs4AABUq6KEcQLjAAAAAAAjoNKGUlJSzGXDhg1dbp83b540atRITj/9dJk8ebJkZGSU+BzZ2dmSmprqslUHSrMBAIBAkptfIK+t2GF+/v3QDhIZHlBf+wAAqHKUUgcAAAAA2AXMGdKCggK59957ZciQISYAbrnhhhvknXfekeXLl5ug+Ntvvy033XRTqX3L4+PjnVvr1q2rbsxuq84drEIHANQgx48flxtvvFHi4uKkfv36Mm7cOElLSyv1MVlZWaYNSkJCgsTGxsro0aMlKSnJZZ8//elP0q9fP4mKipI+ffoUe47du3dLSEhIsU1bq6DyfLThgBxIzpRGsZFy3YA2/h4OAAB+LKXu75EAAFB9vv76a7nsssukRYsWZq790Ucflbq/ti7Vc/CdO3eW0NBQc47ekwULFkjXrl0lOjpaevbsKYsWLaqidwAAQBAExvUk+6ZNm+Tdd991uf2OO+6QESNGmIOtnrx/66235D//+Y/s2FGYAeVOg+eaeW5t+/btq7Ixu8fBWYUOAKhJ9Li6efNmWbJkiXzyySdm8qzH3dJMnDhR/ve//5kJ8VdffSUHDx6UUaNGFdvvtttuk2uvvbbU5/ryyy/NBNzaNJiOyustPm3pb+bn28/pINERYf4eEgAA1S606IwHpdQBAMEkPT1devfuLdOnT/dqf63A2rhxY3n44YfN4zxZtWqVXH/99WZB/YYNG+TKK680m57PBwCgJvFrj3HLhAkTnCfkW7Uqvf/lwIEDzeX27dulY8eOxe7X7DTdqoN7HJy4OACgptiyZYssXrxYvv/+e+nfv7+57ZVXXpGRI0fK888/b1aWu9MFZ7NmzZL58+fL+eefb26bM2eOdOvWzWR7Dxo0yNz28ssvm8sjR47ITz/9VOIYNOu8WbNmVfQOg9tbq3fL/hOZ0jQuSm4Z3NbfwwEAwC9CizLGWcQOAAgml1xyidm81a5dO5k2bZr5efbs2R730fsvvvhi+fOf/2yu//3vfzeL7F999VWZOXNmJY0cAIBanjGupcc1KK4Z4MuWLZP27duX+ZiNGzeay+bNm4u/OcR1cs0qdABATbF69WpTPt0Kiqvhw4ebsmlr1qzx+Jj169dLbm6u2c+iZdTatGljnq+8Lr/8cmnSpImcffbZ8t///reC7wTuTqTnyCvLtpuf77uoi8REBsQ6SAAAql1YUY9x5uoAAPhG5/z2cwFKq7xW5FwAAAD+FO7v8umadfbxxx9LvXr1JDEx0dyuvcHr1KljyqXr/Zq9plllmnWmJVyHDh0qvXr1En9zn1sz2QYA1BR6zNWgtF14eLg0bNjQeTz29JjIyEgTULdr2rRpiY/xRHuTv/DCCzJkyBATiP/www9NCTbte6bB8tLKu+lmSU1N9fo1g0V2Xr7ct+BHOZmVJ92ax8noM0qvxAMAQDBkjBcU+HskAADUbDrn17l/ec4FMIcHAAQiv2aMv/baa6Ys67Bhw0wGuLW999575n49+a79Ry+66CKTkXbffffJ6NGjTW/TQKAZ73aUZwMA+NuDDz4oISEhpW5bt2716xgbNWokkyZNMu1RzjzzTPnHP/4hN910kzz33HOlPm7KlClm8Zy1tW7dWoLVsbRsWbzpkMxfs1e2JZ509hW/650fZNnWwxIVHipPXtnDmSkHAEBQl1JnETsAANWOOTwAIBCFB1Jg2Z0eLL/66qtqG0950WMcABBodBHZrbfeWuo+HTp0ML29Dx8+7HJ7Xl6eHD9+vMS+33p7Tk6OJCcnu2SNJyUl+dwrXIPk2p+sNJMnTzYBdftq82CcWB9KyZSR076RExm55np4aIj8eUQXWbQpUX7clyzREaEya8yZ0q9tQ38PFQAAv7IWiLGIHQAA3+icX+f+dmWdC2AODwAIRDSdrMxS6ky2AQB+1rhxY7OVZfDgwSbArX3D+/XrZ25btmyZFBQUmCC1J7pfRESELF261FRwUdu2bZO9e/ea5/PFxo0bTdWY0kRFRZkt2D3xv19MULx5fLQ0iYs2wfApnxVWAagfEyEzb+ongzok+HuYAAD4nVU4paxF+QAAoHQ659dzAffee6/zNl3cXtq5AObwAIBARGDcB+49xekxDgCoKbp16yYXX3yxjB8/XmbOnCm5ubkyYcIEue6666RFixZmnwMHDsgFF1wgb731lgwYMMCUPhs3bpxZ8a29yOPi4uSPf/yjmQgPGjTI+dzbt2+XtLQ002ssMzPTBL1V9+7dTZuUf/3rX+ayb9++5vaFCxfK7Nmz5c033/TTpxF49AT+kbRsaVIv2uX25VsPy2ebEk0G3Oxbz5SuzerJjBU75PkvtkmXpvXkjZv7S5uEGL+NGwCAQBJqZYwzVwcABBGdj+u83LJr1y4zL9d5fJs2bUwmt873da5vsebt+tgjR46Y6zpv13m8uueee+Tcc8+VF154QS699FJ59913Zd26dfLGG2/44R0CAFBxBMYrs8c4k20AQA0yb948EwzX4HdoaKjJAn/55Zed92uwXDPCMzIynLe99NJLzn2zs7NlxIgRMmPGDJfnvf32211aoVgBcJ2Mt2vXzvz897//Xfbs2SPh4eHStWtXee+99+Tqq6+uhnddM/x77T75639+llsGt5XHL+9hesOv/O2o3LfgR3P/bUPaSbfmcebnu8/rJNed2Vrqx0TSUxwAAJswq8d4gb9HAgBA9dGA9Xnnnee8bpUzHzNmjMydO1cOHTpkKr/ZWfN2pZXl5s+fL23btpXdu3eb28466yxz28MPPyx//etf5bTTTpOPPvpITj/99Gp7XwAAVAYC4z5wD4MTFwcA1CS6WlwntiXRILb7IrDo6GiZPn262UqyYsWKUl9XJ+O6oWTz1uwxl2+t3iOhISGSmZMv76/fZ75r9GgRJ/cM7+yyf0Is5ekAAHBnLRijlDoAIJgMGzas1GOfBsfdeXOsvOaaa8wGAEBNRmDcB+6l0/PpMQ4AAHy040iabD6YKprkpl815q4qXKGvrh/QWh69rIdER4T5dYwAANQERQnjzNUBAAAAAAaBcR+4L6SjxzgAAPDVJz8eMpfndm4sA9snyKyVu2Ro50byf/1by6AOCf4eHgAANa+UOnN1AAAAAACBcd+4Lzpnrg0AAHyh5ev+++MB8/NlvVrI6H6t5K5hHf09LAAAangpdX+PBAAAAAAQCEL9PYCazOHWZZzybAAAwBdbE0/KjiPpEhkeKhf2aOrv4QAAUKOFWBnjzNUBAAAAAATGfUMpdQAAUJmWbT1sLoee1ljioiP8PRwAAGpFxjiBcQAAAACAIjDuY7lTOwLjAADAF9/tPGYuzzmtkb+HAgBArekx7j53BwAAAAAEJwLjPnBfdM4idAAAUFE5eQWybvcJ8/OgDgn+Hg4AADVeUVxc8gmMAwAAAAAIjPvGfW5NeTYAAFBRPx9IlszcfGlYN1JOaxLr7+EAAFCLSqn7eyQAAAAAgEBAYNwH7qXTKaUOAAAq6rudx83lwPYNJbToRD4AAPA9ME4pdQAAAACAIjBeiQpYhQ4AAHzsL04ZdQAAKoe1zoxS6gAAAAAARWDcB2SMAwCAykB/cQAAKl9oUZNx2p4BAAAAABSB8crsMU5gHAAAVMDXvx6hvzgAAFVUSr2AwDgAAAAAgMC4b9wzxOlbBgAAyiszJ18e/2Sz+XlU35b0FwcAoJIzxomLAwAAAAAUgXEfuM+t8+kxDgAAymnq0l9l3/FMaR4fLfde2NnfwwEAoNawFptR3Q0AAAAAoAiM+8A9Q5we4wAAoDySUrPkzW92mZ+fuOJ0iY0K9/eQAACoNcKsjHFSxgEAAAAABMZ94x4HZ7INAADKY/nWw5Jf4JDereLlwu5N/T0cAABqldCiMx4sYgcAAAAAKALjPnCfXBMXBwAA5bFi2xFzeX5XguIAAFRlj3H3im8AAAAAgOBDYNwH7vNq+pYBAABv5eQVyMrtR83P53Vt7O/hAADg0fTp06Vdu3YSHR0tAwcOlLVr15a479y5cyUkJMRl08f5u5S6YiE7AAAAAIDAuA/cJ9aUZwMAAN5at+e4pGXnSaPYSDm9Rby/hwMAQDHvvfeeTJo0SR599FH54YcfpHfv3jJixAg5fPhwiY+Ji4uTQ4cOObc9e/aIv4SG2gPjzNcBAAAAINgRGPeBQ9xKqbMEHQAAlLOM+tDOjV1O3AMAEChefPFFGT9+vIwdO1a6d+8uM2fOlJiYGJk9e3aJj9Es8WbNmjm3pk391y7EfnjNZ74OAAAAAEGPwLgP3BecM88GAADeWrGtMNvuvC5N/D0UAACKycnJkfXr18vw4cOdt4WGhprrq1evLvFxaWlp0rZtW2ndurVcccUVsnnz5lJfJzs7W1JTU122yhJGxjgAAAAAwIbAuA8cbhNrVqADAABvnEjPkV+T0szP55zWyN/DAQCgmKNHj0p+fn6xjG+9npiY6PExXbp0MdnkH3/8sbzzzjtSUFAgZ511luzfv7/E15kyZYrEx8c7Nw2oV5ZQeowDAAAAAGwIjPvAfWLtHigHAADwZPPBwmy4tgkxUj8m0t/DAQCgUgwePFhuueUW6dOnj5x77rmycOFCady4sbz++uslPmby5MmSkpLi3Pbt21clgXEWsgMAAAAAwv09gJrMfVqdT2AcAAB4YdPBFHN5eot4fw8FAACPGjVqJGFhYZKUlORyu17X3uHeiIiIkL59+8r27dtL3CcqKspsVcGllDqBcQAAAAAIemSM+8C9RxnzbAAAUJ6M8e4t4vw9FAAAPIqMjJR+/frJ0qVLnbdpaXS9rpnh3tBS7D///LM0b95c/MEWF6fHOAAAAACAjHGfuM2rWYEOAAC8sflAUcZ4SzLGAQCBa9KkSTJmzBjp37+/DBgwQKZOnSrp6ekyduxYc7+WTW/ZsqXpE66eeOIJGTRokHTq1EmSk5Plueeekz179sjtt9/ul/GHhISIVlPXmDgV3gAAAAAABMYrNWOciTYAAChdWnae7DqWbn7uQcY4ACCAXXvttXLkyBF55JFHJDEx0fQOX7x4sTRt2tTcv3fvXgkNPVWI7sSJEzJ+/Hizb4MGDUzG+apVq6R79+5+ew9hISGS53BIQYHfhgAAAAAACBAExn3gHgjPJ2McAACUYcuhVJO51iwuWhrFVk1PVQAAKsuECRPM5smKFStcrr/00ktmCyShWk+9wMFCdgAAAAAAPcZ94T6vZp4NAAC8L6NOtjgAANXVZ5yF7AAAAAAAAuM+cJ9X07MMAACUZdPBVHPZvQX9xQEAqI5S6oqMcQAAAAAAgXGf0GMcAACUzyYrY5z+4gAAVE8pdTLGAQAAAAAExn3jPq8uYKINAABKsf9EhmxNPGnKup7RtoG/hwMAQK0X6swY9/dIAAAAAAD+RmDcBw63DHEm2gAAoDSLNyWayzPbNZRGsVH+Hg4AALVeWFHGOBXeAAAAAAAExiuzxziRcQAA4EVg/JLTm/l7KAAABFXGOPN1AAAAAACBcR+4T6tZgQ4AAEpyODVL1u89YX4eQWAcAIBqEVZ01oP5OgAAAACAwHgllFIvWoDORBsAUKMcP35cbrzxRomLi5P69evLuHHjJC0trdTHZGVlyd133y0JCQkSGxsro0ePlqSkJOf9P/74o1x//fXSunVrqVOnjnTr1k2mTZtW7HlWrFghZ5xxhkRFRUmnTp1k7ty5Utt9/kuS6FeFPq3rS/P4Ov4eDgAAwdVjvMDfIwEAoHp8/fXXctlll0mLFi0kJCREPvroozIfU9Yc/bHHHjPPZd+6du1ahe8CAICqQWDcB1YcPNzZs8y/4wEAoDw0KL5582ZZsmSJfPLJJ2byfMcdd5T6mIkTJ8r//vc/WbBggXz11Vdy8OBBGTVqlPP+9evXS5MmTeSdd94xz/3QQw/J5MmT5dVXX3Xus2vXLrn00kvlvPPOk40bN8q9994rt99+u3z++edSm335S+ECAsqoAwDgh1LqLGQHAASJ9PR06d27t0yfPt2r/b2do/fo0UMOHTrk3FauXFlF7wAAgKoTXoXPXetZGeJhoSGSm++gZxkAoMbYsmWLLF68WL7//nvp37+/ue2VV16RkSNHyvPPP29WlrtLSUmRWbNmyfz58+X88883t82ZM8dkhX/33XcyaNAgue2221we06FDB1m9erUsXLhQJkyYYG6bOXOmtG/fXl544QVzXR+vE+qXXnpJRowYIbW1ysyP+5PNz2d1bOTv4QAAEDR0vq6o8AYACBaXXHKJ2bzl7Rw9PDxcmjVjoTcAoGYjY7xSMsZDXUqrAwAQ6DRYreXTraC4Gj58uISGhsqaNWs8PkazwXNzc81+Fi2d1qZNG/N8JdGAesOGDV1e2/4cSifbpT2Hys7OltTUVJetpth/IlOSM3IlMixUOjeL9fdwAAAIGkVxcSlgITsAAB55O0f/7bffzCJ6XQCvFej27t1bzSMFAMB3BMYrKWNc5dOzDABQQyQmJpqS53a6+lsD2HpfSY+JjIw0AXW7pk2blviYVatWyXvvvedSol331ce4P4cGujMzM0sc85QpUyQ+Pt65aR/zmuLnAynmskuzehIVHubv4QAAEDRCnfN1AuMAAHjizRx94MCBpu+4Vp577bXXTPn1c845R06ePFkrF7cDAGovAuM+sKbVp3qMM9EGAPjXgw8+KCEhIaVuW7durZaxbNq0Sa644gp59NFH5aKLLvL5+bRXuWafW9u+ffukpgXGe7aK9/dQAAAIKmFFPcaJiwMAUHFamv2aa66RXr16mWzyRYsWSXJysrz//vu1cnE7AKD2ose4DxxuGeOUUgcA+Nt9990nt956a6n7aNkz7Qt2+PBhl9vz8vLk+PHjJfYM09tzcnLM5NeeNZ6UlFTsMb/88otccMEFJlP84YcfLvY8+hg7vR4XFyd16tQpcdxRUVFmq4l+3l8UGG9JYBwAgOoU6gyMM18HAMCTiszR9ZxA586dZfv27aUubp80aZLzumaMExwHAPgbgfFK6TFeVJqNiTYAwM8aN25strIMHjzYBLi1b3i/fv3MbcuWLZOCggJTIs0T3S8iIkKWLl0qo0ePNrdt27bN9BXT57Ns3rxZzj//fBkzZow89dRTHl9bV5fbLVmyxOU5ahNdOOfMGCcwDgBAtaKUOgAApavIHD0tLU127NghN998c61c3A4AqL0opV4ZPcbDKM0GAKhZunXrJhdffLGMHz9e1q5dK99++61MmDBBrrvuOmnRooXZ58CBA9K1a1dzv9LSZ+PGjTMrvpcvX26C6mPHjjWT5UGDBjnLp5933nmmdLrup73KdDty5Ijzte+8807ZuXOnPPDAA6as+4wZM0z5tYkTJ0pttO94pqRk5kpkWKh0blrP38MBACCohBWd9SBjHAAQLDRovXHjRrMp7QeuP+uidiuT+5ZbbinXHP3++++Xr776Snbv3i2rVq2Sq666SsLCwuT666/3wzsEAKDiyBivlB7jhTPtAiLjAIAaZN68eSYYriXPQ0NDTRb4yy+/7Lw/NzfXZIRnZGQ4b3vppZec+2ZnZ5veYjpptnzwwQcmCP7OO++YzdK2bVszgVbt27eXTz/91Eyyp02bJq1atZI333zTPFdtZGWLd2teTyLDWZMIAEB1opQ6ACDYrFu3zixYt1jlzLWq29y5c+XQoUPOILm3c/T9+/ebIPixY8dMlbqzzz5bvvvuO68q1gEAEEgIjPvAioNbPcaZaAMAapKGDRvK/PnzS7y/Xbt2pgy4XXR0tEyfPt1snjz22GNmK8uwYcNkw4YNEgyswPjplFEHAMBvgfH8An+PBACA6qHzbfe5vJ0Gx8s7R3/33XcrbXwAAPgTaUu+KPqC4ewxzkQbAAC42X74pLns2jzO30MBACDoWAvZ6TEOAAAAACAw7gMyxgEAQFl2HU03l+0T6vp7KAAABJ2i6XqpmXMAAAAAgOBAYNwHDnHNGCcwDgAA7DQ7bd/xTPNzu0Yx/h4OAABBx1lKnfk6AAAAAAQ9AuM+KCgqnU7GOAAA8ORgcqbk5BdIZHiotIiv4+/hAAAQdCilDgAAAACwEBj3gTWtDg8t/BjpMQ4AADyVUW/bMEZCrVquAACg2gPjrGMHAAAAABAY94HVo+zURJuZNgAAOGX3scLAeLtG9BcHAMAfQqxS6mSMAwAAAEDQIzDuAysOHh7GRBsAABS3+2iGuWyXQH9xAAD8oWi6To9xAAAAAACBcV9YPcVP9Rj384AAAEBAIWMcAAD/osIbAAAAAMBCYLxSeoxbgXEm2gAA4JTdRT3G2ycQGAcAwL+l1P09EgAAAACAvxEYr9SMcQLjAACgUF5+gew9XlRKnYxxAAD8IswKjDNfBwAAAICgR2DcF1aP8dDCj5Ee4wAAwHIgOVPyChwSFR4qzeKi/T0cAACCEqXUAQConb7dflSmfLZFMnPy/T0UAEANEu7vAdRkVoZ4eJg10fbzgAAAQMDYVVRGvV1CXQktOikPAACqV1HCOAvZAQCoZSYv/NlUaQuREHnwkq7+Hg4AoIYgY9wH1rzaWoHORBsAAFj2HCsso942IcbfQwEAIGgxXwcAoPbZdzzD2bps1sqdzoXpAACUhcC4DxxFtdTD6TEOAADcWJN0AuMAAPi/xzjTdQAAao/VO485f87Nd8iTn/zi1/EAAGoOAuM+KCgovAwr6jFOYBwAAFj2nygMjLduSGAcAAB/CSkKjOczXwcAoNb4bkdhYHxkz2YmaW3p1sOy/XCav4cFAKgBCIxXglMZ4/4eCQAACBT7T2Say1YN6vh7KAAABK2worMelFIHAKB2cDgcsqooMH7DgLZyRtsG5ueN+5L9PDIAQE1AYNwHVoY4PcsAAEBJgfGW9ckYBwDAX6z5up5EBwAANd/uYxmSmJolkWGh0q9tA+nVMt7c/tN+AuMAgLKFi5cmTZrk7a7y4osvSjCw5tXWRJtS6gAAQJ3MypWUzFzzc0syxgEA8H8p9aJWaAAAoGZbteOouezbpr7UiQyTnq2swHiKn0cGAKhVgfENGza4XP/hhx8kLy9PunTpYq7/+uuvEhYWJv369ZNgYQXCT5VSJzAOAABEDiQXZos3iImQ2Civv24BAIBKFkaPcQAAahWrjPrgjgnmsner+ubyl0OpkpNXIJHhFMkFAJTM6zO1y5cvd8kIr1evnvzrX/+SBg0Ke3icOHFCxo4dK+ecc44EC2ta7cwYZwU6AADQMurHrf7ilFEHAMCfTs3XCYwDAFAb9GlVXxJTsuTsTo3M9bYJMRIXHS6pWXnya9JJOb2otDoAAJ5UaPnUCy+8IFOmTHEGxZX+/OSTT5r7goXDLWOcFegAAEDtP5FhLltRRh0AAL8qShinwhsAALXE+KEd5MO7zpL+7Ro626b0Ksoa//kA5dQBAFUQGE9NTZUjR44Uu11vO3nypASLUz3GQ10C5QAAILjtP2FljBMYBwDUbNOnT5d27dpJdHS0DBw4UNauXevV4959911zovrKK68Uf6KUOgAAtd+pPuPJ/h4KAKA2BsavuuoqUzZ94cKFsn//frN9+OGHMm7cOBk1apQEXY/xsKKJNqXZAACAS2CcUuoAgJrrvffek0mTJsmjjz4qP/zwg/Tu3VtGjBghhw8fLvVxu3fvlvvvvz8gWq1RSh0AgNqvtzMwTsY4AKAKAuMzZ86USy65RG644QZp27at2fTniy++WGbMmCFB22OceTYAANDAeDKl1AEANd+LL74o48ePNwvju3fvbs4FxMTEyOzZs0t8TH5+vtx4443y+OOPS4cOHcTfQpmvAwBQ6/UsKqW+LfGkZOXm+3s4AIDaFBjXSe66devkqaeekmPHjsmGDRvMdvz4cRMUr1u3rgQLa8W51WOcnmUAAMCeMd6SwDgAoIbKycmR9evXy/Dhw523hYaGmuurV68u8XFPPPGENGnSxFSU80Z2drZp12bfKlPRdJ0KbwCAGkVbdtK203st4qOlcb0oyStwyCb6jAMAKjMwHhYWJhdddJEkJyebIHivXr3MFkwB8ZIzxvmyAgBAsDuZlSvJGbnm55b1CYwDAGqmo0ePmoXxTZs2dbldrycmJnp8zMqVK2XWrFnyz3/+0+vXmTJlisTHxzu31q1bS1X0GGe+DgCoCd566y3p2bOn1KlTx2x63v3tt9/297ACXkhIiPRtXZg1vmGv933GX1n6m0x8b6PsPVZY9U3pgoT9JzJk475kWbvruOTmF1TJmAEA/hFekQedfvrpsnPnTmnfvr1PL64TYO1TvnXrVnOgP+uss+SZZ56RLl26OPfJysqS++67T959912zklz7mWlmuvvk3B+sebWVMc4xEgAAHEguzBavHxMh9aIj/D0cAACqxcmTJ+Xmm282QfFGjRp5/bjJkyebPuYWzRivzOD4qVLqBMYBAIHfwuRvf/ubTJgwQYYMGeJcdHbnnXeaBWsTJ0709xADWt82DeSLX5Jkw74TXu1/MDlTXljyq/l58aZEubRXc/N9Yd3uE7L3+KlA+dX9Wsnz1/T26jmPpWXLpz8fkq+2HZGtiSflzmEd5eZBbSv4jgAAARMYf/LJJ+X++++Xv//979KvX79i2eJxcXFePc9XX30ld999t5x55pmSl5cnf/3rX002+i+//OJ8Tj3gf/rpp7JgwQKzely/GIwaNUq+/fZb8TernE1YaGHiPeVtAADA/uOFgXH6iwMAajINbmvFuKSkJJfb9XqzZs2K7b9jxw7ZvXu3XHbZZc7bCgoKV4+Hh4fLtm3bpGPHjsUeFxUVZbaqElqUMc5CdgBAoHvllVfktddek1tuucV52+WXXy49evSQxx57jMB4Gfq2KV/G+BebE51Jb5m5+fLB+v3O+yLCQqRJvWg5mJJpbh/Ro5lc2N01UU9jAd9uPyazVu6U4+k5Eh0RJj/sPSG5+adiBH/7aJPsPJImD43sJuFh5S7eCwAIlMD4yJEjnQdmLVNiPxjodS235o3Fixe7XJ87d67pRaZ9zIYOHSopKSmmDNv8+fPl/PPPN/vMmTNHunXrJt99950MGjRI/KmgWMY4gXEAQMXt27fPHEdbtWplrq9du9YcA7t37y533HGHv4cHLx0+mW0um8VF+3soAIAgVRnfKSIjI81C+KVLl8qVV17pDHTrdV2w7q5r167y888/u9z28MMPm0zyadOmVXqJdG85W58xXwcABLhDhw6Ziqru9Da9D6Xr1Spe9LB/KCVLDqVkSvP40hera3a5euDiLmbf3UfTJSwsRDo1jpUhnRpJ3ahwmfLZFnn9q50yeeHPckab+pIQW7iYLyevQMa/tU6++vWIx3GM7NlcMrLz5OVl22XOt7vl+93H5ZnRvaRHi/gqevcAgCoNjC9fvlyqggbCVcOGDc2lBshzc3Nl+PDhLpPtNm3ayOrVq/0SGNeeInuOpUvHxrHiKOoyTo9xAEBluOGGG8zJai1Dqr07L7zwQrMyfN68eeb6I4884u8hwsvSaaph3Uh/DwUAEKQq6zuFljgfM2aM9O/fXwYMGCBTp06V9PR0GTt2rLlfM9patmxp2qRFR0ebtmt29esXZm65316drIxx5usAgEDXqVMnef/9901VVbv33ntPTjvtNL+Nq6aIiQyXrs3i5JdDqbJxb7I071lyYPxEeo6s2XXc/KzZ4G0TXCviWiYO7yzLthyW3w6nmUD4vNsHSZ3IMBMw16B4VHioXD+gjZzVMUFSs/Kke/M46d7iVDXdrs3j5MEPf5JNB1Ll8le/ld8P7SB/uuA0k11elVZtPyprdx+XK/u0lHaNPL83AAhWFQqMn3vuuZU+EF15fu+995r+KdakWSfsukrdmkxbtL+43ueJ9iHXzd6frDI9u3ir/PObXTL71v6nMsbDrIl2pb4UACDIbNq0yZx0VjoZ1uOhtg754osvTE8xAuM1w7H0HHPZsG7VlYUFAKA6vlNce+21cuTIEbO/zsH79OljKr/pnFzt3btXQotaiwWqonXskk9gHAAQ4B5//HFz7P3666+dPcb1+K3VWvR4Du/KqWtgfMO+ZLmkZ/MS91u29bCp/tq1Wb0Sg+JKA9jTbzxDrn5tlfywN1nG/et76dkq3mSBq+k3nCHD3Uqs22nmeP92DeSx/26WRT8nyowVO+TzzYnyz1v6S4fGsT6916zcfNlyKFU2HUw1C/QzcvKlbmS4/Hr4pHz6U2GFgWlLf5MLujaR285uL4M7JLhU/wWAYFWhwLglIyPDTIRzcgpPAFt69epV7ufSXuM6eV+5cqUvQzIr1fVLRFXZdTTDXO7T/qFF82oyxgEAlUGrpFg9Nr/88kvTssSqlkLZtJpDe4upRrFkjAMAav53Ci2b7ql0ulqxYkWpj9V2af5GKXUAQE0xevRoWbNmjbz00kvy0Ucfmdu0pai2ROnbt6+/h1cj9G3TQOat2Svrdhdmgx9IzpR/fLbV9PnW8udTRvWU/u0ayuKi/uIX9WhW5nN2blpPZt96ptw0a42s2nHMbOqOoR1KDYpbtFf5jBv7mYC49hzfcSRdrpqxSv54fidJy84zFWojwkLlzHYNTea5N8HrtbuOy53vrHeef3CnX3/6tK5vgvlfbjlstnpR4RIaGmJuf/jSbnJa03plvg4A1EYVCozrinEtnfbZZ595vN/bHuMWnWR/8sknZjWc1QNNNWvWzATdk5OTXbLGk5KSzH2eTJ482ZR7s2eMV2Yvs5z8AnOZV+BwBsLpMQ4AqAxa4nTmzJly6aWXypIlS+Tvf/+7uf3gwYOSkJDg7+HBS9bElFLqAAB/4TuFp1Lq/h4JAABl69evn7zzzjv+HkaNNbB9Q9FDvwkI/5Ik01dslw17k533P/rfzTLtur6ydEthf/GRPcsOjCsNps8fP0gWrNsv2bn50iw+WiZe2LlcY9OS7We0aWBKsm/clyxPfrql2D4dG9eVni3jpVl8HblxYBtp3TCm2D7f/HbEPEdWboE0iIkwge7m9etI3cgwE2gvKBC5eXBbOb1lvOw4kiZzv90tH6zfLyez88zjtQT8t9uPmhLrGpQ/q2MjGXd2O+nUhEA5gOBQocC4ljzXYLWuYBs2bJj85z//McHqJ598Ul544QWvn8fhcMgf//hH83hdad6+fftiXwQiIiJMuRhdMae2bdtmstQHDx7s8Tl1Vby1Mr4q5OTlO1ebW/PqsKLScSSMAwB88cwzz8hVV10lzz33nOnn2bt3b3P7f//7X2c5VNSkUuoExgEA/sF3ilMopQ4ACGSa1BUXF+dVS1BrP5RMA8m3DWkvs1bukrvmrZfcfIfJlJ4yuqf85YOfZPPBVBNU1gVzw7s1MT3JvaVBbd180bhelLx7xyB5acmvpm9507hoiY4IlZSMXJNRrtnkuql/rdotfx7RRW49q53J9Fa7j6bL7f9aJ9l5BTKsS2OZeVO/UvuVd2wcK3+/8nT5yyVdJTElSzJy8uTlpdvlyy1Jsv1wmtlnz7G98u+1e+Xczo3l0l7NZfOBFEnJzJUHL+lmFgDURBrw12RGSscDqLTA+LJly+Tjjz+W/v37m35ibdu2lQsvvNAcnLWUua5K97Z8+vz5881z1atXz9k3PD4+XurUqWMux40bZzLAGzZsaJ5fA+kaFB80aJD4g5ZcUWSMAwAqmy42O3r0qJkMN2hwarJ1xx13SExM8VXCvjp+/Lg5rv7vf/8zx3NdhDZt2jSJjS25z1VWVpbcd9998u6770p2draMGDFCZsyY4ew1+uOPP8o//vEP0xpF30u7du1ML9N77rnH+Ry6GO68884r9txa2rWkijA1ifb2Ugn0GAcABMl3ikAWFla4kD0/n/k6ACDw6HFa58JNmjQxFVM9BfI0uUxvL2+V1mB1/0VdTEb47mOFLVEfvbyH/K5XC9l66KS8uny77DpaGHgub8Z3ZdFA9uSR3YrdfjIr1/Q+T0rNMqXPtVz6E5/8IvtPZMrffle4/yP/3WyC4tov/I2b+0tkeOH3nLLERoVLpyaF53reHNNfNh9MkZNZeZKZmy//XrNXlmxJMpnkulm0ZPyL/9dHOjSuawL6Wu49UBxNy5afD6SY/zd08UNyRo5sOXRSVu84JnuPZ5j31apBHRnVt6WMOqOVyY6vbJk5+eZ3pdvhk9nm8sjJbPP/amxUmNSNCpeo8DDzez2RkSsn0nNMIsXhk1mSmplrxq2/v7g6ERJfJ0LqF106t5jCy6jwUEnOyJX0nDxTCSksJMQslLAWf+o/GSGirxkuDerqYyLN4/S5I8JCJDy08NKbRQKaDJqWkydZOfkmKVSfp7SFF0BQBcbT09PNwdo6eGtp9c6dO0vPnj3lhx9+8Pp5XnvtNeek3W7OnDly6623mp+1p4p1st5+At5f9B8spUFxa8E5PcYBAJUhMzPTfKm3TmDv2bPHVFXRnmJ6/KtsN954o5mAa4lV7UWqbVL0hLkuWivJxIkT5dNPP5UFCxaYBWzaDmXUqFHy7bffmvvXr19vviNo6TdtZbJq1SrznGFhYcX6k2oVGPuKd+u7RU2mv78TGYUZ4wn0GAcABMl3ikAWUTRf18XtAAAEGk1A04QwtXz58kp5Tm1XqlVjdH6uc379DnDllVeW+hhdwK7JaZs3bzZz+Ycffth5ft4yffp087ya3KbVaF555ZWArERTJzJMnrumt9w8a41c1L2ZjD6jpbn99nPamyxsLSl+yenNpEeLeAkk9aIj5Io+RWM9u4P8a/Vuefx/v8jsb3dJTGSYNIqNlK9/PSKRYaHy9KieXgfFPbG/9/O6NJE9x9Jlzre7ZcO+ZOnZMk6+33VCtiWdNH3VlZZsv35AG/M4Peehr90gJlIGdWhoxl0dLetW7ThqguHrd5+Q9XtPlFm9VxcUvLxsu9nOaFNferWqbwL8mk2ugXMN/uplZm6B+d6sAWBNfNQFA/o3lFA30gSi8woKTEwoKzffBL4Ti4Lhul9NojEsDZBHhIZKVESoeY91IsLM+07LyjO/V60U4P6VWQPz9WMipG5kuPm9my0s1DyfCdSbzPzC9kWFt2mw3grgF/6s38f1cfqZ6WeoCxt0sUBcnXBpHBsljXSrV3jZMCZCYiLDNdpvFoHo89SJDHWOVe/T19h3IkOOnswx1Rp1QYAu3EjNzDPtA/R3XD8m0iw2sO6z04UEFv1MGuhz6P4xxfctKXlW2xboggx9Pxk5hYuW9Hl0IUmc7f8J/ZvSvx2tXhWrYw8NMX9v2rJZ2yHo35Iu1tHk2yb1os3fqP6/Hl7OhSj6nPp5FW755nX196S/5+jwMGfVCfgQGO/SpYs5ma1ZYHoQfP31183P2sOsefPm5fpllSU6OtocdHULBM6McdtqcytjnHk2AMAXV1xxhQkya4a1tiwZOHCgaSmiGV8vvvii3HXXXZX2Wlu2bJHFixfL999/byrAKJ3Ujhw5Up5//nlp0aJFscekpKTIrFmzTOD8/PPPdy5m05Ps3333nanmctttt7k8pkOHDrJ69WpZuHBhscC4tSK+NknNynMuoqOUOgAgGL5TBDprIXu+NtwEACDAnHvuuc6ftc2oBqXdMzv1HPq+ffvKldSm5+x1fq7fB8qya9cuUwFWvzfMmzfPtDW9/fbbzXl+a0Hde++9ZwLnev5fv1dMnTrV3KcxgkBc5H5mu4ay8ZGLTGDI+jw1UPb4FT1k3pq98uAlXSWQaRBr7JD2Jrilvcg1091y57CO0r6SM6DbJtSVxy7v4byuWc4Pf7TJZJAXBk1zZcaKHcUep1nK1/RvJZf2bG56nZc3mOeJvmfNqM7IzTcZ9B9tOCA/eAiEaz92zcrW73oaAG3ZoI7pl96jRZy5XTPeP1y/3/Rk157zulU2LYPfLC5amsRFm7L4GuRV6dl5JvNa+9HrwgENuGrgVc8T6X5WAFZjTclFAWndUosuk4sudbN6yet70n8L9PPR00722Jr+6MxMz8jxGLQ3j9MgrRTIycJChyUqzEIvjHdpoDUpVR9QxoMqQN/fvuOZEkjqRYeb35V+VrpwQgPy+neelZdv/l/QhTVWjLCsRQgaQ7QvztXPVRca6GdaWmhU99MqlE3qRZlFMbqQQf8tU+nZ+WYM+jemAXkNguvzlTUmfbxZEFG0wCA6IrTosmgLDzV/Y9o+oUV8tPm71fett+lnYv396Wvq/hq81wUGWslgW+JJsyBBx6ZzLq2CYFVC0AUR2bkFzgUWWkXB+pz1/wd9f/5oeVChwLiWQ9XVZurRRx+Viy++2Bw0IyMjZe7cuVKb6UoOpSuFLGSMAwAqg1Zd0Uop6oMPPjDlyTds2CAffvihPPLII5V6EluD1RqUtoLiavjw4aZKy5o1a0xfUne62lwzy3U/S9euXaVNmzbm+Upqc6IBdWsFvF2fPn1MNZjTTz9dHnvsMRkyZEipY9Z9dbOU1X/NH3QVs6qrKzIpNwUACILvFIEuPIyMcQBAzaCBcausunsbNL3P21Lql1xyidm8pcFuff4XXnjBXNfF79oeTb9LWIFxXVg3fvx4U2nOeoxWk5s9e7Y8+OCDEog8zcm1rLZuNcXt53QwmbgfrN8vJ7NzpV1CXfnDsI5V/roaFJt2XV/zc15+gSnt/v66fSYwqCW+NSNX+51ruXrNNNdNe7mf1SlBLujaVK7o28IZACuJ9jzfkpgqcdHhkplTYALY3+8+Lr8cSjXBYHddm9WT/u0ayOkt4uWczo2lZf06pT7/5b1bmO1wUWn6wgzjbBOo0+CgyaQ1GciF49TX1ATI2OhwE3TUsudKs5014K+BPc3m1cB207goEwzX9xyIfcytEvNWtrv+DvVSf295RRnMGuDUS9006KnBYA3Aa0BT36sqzIrONZv2p9fYmAZgddMMaP16ra+lcTENmxVWWXb/uTA4rMFbDbTqZ6ibLmZIzco1GddH0nLM70YzyfW1rAxrHYe+hl7X0vXWmHUcWipfM6x1IYA+Rt+b/k47No41v1NdJJBcdJ99HuCerKvvxTxHZm7RAoM8r6sB6PvRALF+fvpncDg125TVtxYhFP+9FP6duT+HtdBFy+wfTcsxj9XPQreK0LHo37KVuGPep/7u8gsCrtJBZHioNIyJlAnnd5KbBrUN7MD4TTfd5Py5X79+pizb1q1bzYnxRo0aSW1mrbyw/1FZE20C4wAAX2RkZEi9evXMz1988YVZ2a2Bag0467G2MmnpM/fJdnh4uAlg630lPUYXwblneevJ9pIeo6XUdWW5TpgtuupcJ9EalNdA95tvvmnaqmhA/owzzihxzFOmTJHHH39cakJ/8YaUUQcABMl3ikAXpjUc3aq+AQAQiKxe4u7S0tJMVdWqogvd7QvglQbE7733XvNzTk6OWSg/efJk5/36vUIfo49F1brt7PZm8xcNCl98ejOzufej/vq3IyZov3L7UROA/Hxzktmmfvmr/OG8TnJV35YmaKg02PzdzmPyzW9Hzf7bD6eV+rqajNi5aT1TCv/SXs2leXzpgfCSaAD7hoFtJJjovyOR4SESKaE+L5DQrXXxXJdax6pUcNwE03PMghQt265Z47ogRMu5x0ZFmIUTJpM6MsxjhQRTLaAoq1yrAmhwXzO19fl0IYCVPR1VlLVtr2phjUOTbkzP+rRss7+VFa6N3/X/p8IxFJaVt55LL6OLLjUors+p/4/q40zrgKKt8OcCU83A+tncV5QRfzA5Uw6lZJlMcL2u70UzwfVSR6mLD/RxVoBdc4Z1MUKXZvVMhrj1Pk3lg6IFCzomDcqfSC+8rmsGdB9rkYW2J/CmurjfA+M7d+40pVEtMTExpZ7Irk3MH2DRSin3ibanVSAAAHirU6dO8tFHH5ls7c8//9z081aHDx926cVdGl2p/cwzz5RZRr06bNq0yZRy1eoyF110kUtLFt0sZ511luzYscOsRn/77bdLfD6dhGvpNnvGuJaZCyTWiuKGdQvLZwEAUFO/U9QWVusz5usAgEBlzXM1kPG3v/3NnGu3aJa4LiLXimtVRRe664J3O72uc+7MzEw5ceKEGYenfTRZriZXfYNv5d6HdWliNv2etelAiim9Pm/NHjmYkmVKsU9ZtEW6t4gzmb5abtm9rHSnxrEmIKfFeQd1SJCzT0swvcDbNoyplLLsgLd0IYbpNe5jW0QNXFuLQdx5U1lSx2Fl1VfG/6Oml3xRVYTKlJNX4MxMr0jVBA2Ea4BdFwFowLxpfFTgB8Z1kt2qVSvTA0UzvPRSbwsGOXmFJWvs/4hbE20SxgEAvtDSpjfccIM5ea09vAcPHuzM9Orbt7CEVVnuu+8+ufXWW0vdRxe3NWvWzJwct8vLyzMl2vQ+T/R2XSmuvUrtWeNJSUnFHvPLL7/IBRdcIHfccYc8/PDDZY57wIABplRbaaKioswWyKxS6o3oLw4AqOHfKWoLa75ub4cGAEAg0XYnVqDg559/NpXaLPqz9gu///77paapCVXfUDk0mNe7dX2z3TG0g/x77V55e/Ue2Xk0Xb7ffcK5X+uGdeTsTo3lnNMayVkdE0zfdwA1T2RRuf2K0mC6Zrzr1qqBVLsKBcb37dsnK1askK+++kqeffZZ01+kRYsWJkB+3nnnye233y61lVVCXVP+3UupswIdAOCLq6++Ws4++2zTU0wnvhYNMHvq+e1J48aNzVYWPUGuAW4th6ZtUdSyZcukoKBABg4c6PExul9ERIQsXbpURo8ebW7btm2b7N2713nCXW3evNmchB8zZow89dRTXo1748aNpsR6TWcFxhsSGAcA1PDvFLUF83UAQKBbvny5udT+3dOmTav26i660F0XvNvpdR1HnTp1JCwszGye9ilpYX1NqfqGyqdZsWOHtJdbz2on6/ecMD2XtZRypyax0jahsJcyAPhThQLjLVu2lBtvvNFs6rfffjMnvufNmyfvvvturQ6May189/5k1gp0eowDAHylk0rd9u/fb65rhRbNpq5s3bp1k4svvtgsbtN+37m5uTJhwgS57rrrzGI3deDAAXMC/a233jJjiI+Pl3HjxpmJrfYi10nyH//4RxMU156lVvl0DYprPzLdz+o9rpNoK2A/depUad++vfTo0UOysrJMj3ENymsWW013LK0oME6PcQBAkHynqDE9xgmMAwAC3Jw5c/zyujqnX7RokcttS5YscS6A16x1XSivi+SvvPJKc5suqtfreh6hJld9Q9XRjND+7YKgOTWA4AiMZ2RkmHKnmjWum5Z76dq1qzkQamn12kpXmFurzHNtZdisiTaBcQCAL3Ri+eSTT8oLL7wgaWlp5rZ69eqZ8ugPPfSQhBYdbyqLLmjTY7cGv/W5NQv85Zdfdt6vwXLNCNfjvkX7gFv7aq8wDYDPmDHDef8HH3wgR44ckXfeecdslrZt28ru3bvNz1qOXd+TBt61d1qvXr3kyy+/NFVnarpj6YX90xLIGAcABNF3ihpRSt22uB0AgEC1bt06ef/9901lNp072y1cuNCr59Bj//bt253Xd+3aZaq06QL3Nm3amExunY/rInh15513yquvvioPPPCA3HbbbWbhuo7h008/dT6HLnzXqnD9+/c3C+10wXt6errJcgcAoNYHxrWvaIMGDUzG+IMPPijnnHOOuV7baUN5i+eMcb8MCwBQS+iJ6lmzZsk//vEPGTJkiLlNF6I99thjJrPa27Lk3tJJ8fz580u8v127dqbHmV10dLRMnz7dbJ7oWHUrjU62dauNrFLqCXVZFQ8ACJ7vFIHe81LRYxwAEOi0Eustt9xiFqBrRbWLLrpIfv31V1OyvDytUDS4bl94bpUz18D23LlzTasVDbxbtKKb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mHz44Ye6dgmPj1LuczkDk87TWbNmlUSfZ/osjPOZQv/++9//9v2xw3/IbbfddgVrOxh+cI0ffnCNH15wfS8dcI0fOrjGg0q7vhO4xhePcr6+E7jGlw7ldo0vtes7gWs8qLRrPK7vxQXX+OJda3B9Ly6ldo1PlfL1PQUyctddd6UaGhpSt9xyS+r1119PnXbaaanRo0enli1blioVzjjjjFR7e3tq7ty5qaVLl7o/3d3d+vW33347dckll6T++c9/phYtWpT685//nJo5c2bq4x//eLGbnvrOd76j203tevrpp1OHHHJIavz48akVK1bo108//fTUjBkzUo899phu/1577aV/SoVEIqHb9/3vf9/3fKn1+caNG1Mvv/yy/qFT/6qrrtK/v//++/r1n/3sZ3pcUztfeeWV1JFHHpnabLPNUj09Pe46DjvssNQuu+ySmj9/fuqpp55KbbnllqnjjjuuqG3v7+9Pffazn01NmzYttWDBAt/47+vr0+9/5plnUldffbV+/Z133kndfvvtqQkTJqROOOGEorWbXvvud7+bevbZZ/X4eOSRR1K77rqr7tPe3t6S7nNm/fr1qebm5tR1110XeH+x+jzTZ2Gcz5TBwcHUDjvskPrkJz+p2z9nzhzd9vPOO6+gbQfFAdf4woJrfOHB9X34rzWZ2o5rfGHANR5U2vWdwDW+OJTD9Z3ANR7X+Hy1u5Sv7wSu8aDSrvG4vhcPXOOLd63B9b04bS/la/wZJXx9hzAek1//+tf6ANXX16f22GOP1HPPPZcqJeiEsP3cfPPN+vXFixfrD/qxY8fqPx622GKL1LnnnqtPmGJzzDHHpCZPnqz7durUqfoxXawY+sD/xje+kRozZow+uT/3uc/pE6hU+Pvf/677euHChb7nS63PH3/8cesYOfHEE/XryWQydcEFF6QmTZqk23vwwQcH9mn16tX6w761tTXV1taWOvnkk/UHczHbThersPFP7yNefPHF1OzZs/UHcWNjY2rbbbdN/fSnP/Vd2Ia73XQBoA90+iCvq6tLbbLJJqlTTz018Id8KfY587//+7+ppqam1Lp16wLvL1afZ/osjPuZ8t5776UOP/xwvX/0BYC+GAwMDBS07aB44BpfOHCNLzy4vg//tSZT23GNLwy4xoNKu74TuMYXh3K4vhO4xuMan692l/L1ncA1HlTaNR7X9+KBa3zxrjW4vhen7aV8jVclfH2vchoIAAAAAAAAAAAAAAAAAAAAAAAAVCSoMQ4AAAAAAAAAAAAAAAAAAAAAAKCigTAOAAAAAAAAAAAAAAAAAAAAAACgooEwDgAAAAAAAAAAAAAAAAAAAAAAoKKBMA4AAAAAAAAAAAAAAAAAAAAAAKCigTAOAAAAAAAAAAAAAAAAAAAAAACgooEwDgAAAAAAAAAAAAAAAAAAAAAAoKKBMA4AAAAAAAAAAAAAAAAAAAAAAKCigTAOAAAAAAAAAAAAAAAAAAAAAACgooEwDsAI4r333lNVVVVqwYIFBdvGSSedpI466qiCrR8AAAAA2XPAAQeob3/728VuBgAAAADyDK7xAAAAQOWB6zsAhQPCOABlBInOJGybP4cddlis90+fPl0tXbpU7bDDDgVvKwAAAADy88X3lltuUaNHjx7WtsydO1f/jbFu3bph3S4AAABQieAaDwAAAFQeuL4DUJ7UFrsBAIDsIBH85ptv9j3X0NAQ6701NTWqo6OjQC0DAAAAAAAAAAAAAAAAAAAAoDSBYxyAMoNEcBK35c+YMWP0azQr7LrrrlOHH364ampqUjNnzlR/+tOfQqPU165dq44//ng1YcIEvfyWW27pE93//e9/q4MOOki/Nm7cOHXaaaepzs5O9/VEIqHOOeccPQOOXv/e976nUqmUr73JZFJddtllarPNNtPrmTVrlq9NAAAAAMi+ZMnFF1+sr99tbW3q9NNPV/39/e4yXV1d6oQTTlCtra1q8uTJ6he/+EVgPb///e/V7rvvrkaNGqX/lvjSl76kVqxY4f69cOCBB+rf6W8M+tuBtkvgug4AAAAUBlzjAQAAgMoD13cASg8I4wBUGBdccIE6+uij1b/+9S8teh977LHqjTfeCF329ddfV3/729/0MiSqjx8/3r0gH3roofpi+sILL6h77rlHPfLII+qss85y308XaYqGuemmm9RTTz2l1qxZo+6//37fNujCe9ttt6nrr79evfbaa+rss89WX/7yl9W8efMK3BMAAABAZfLoo4/q6zZFpf3hD39Q9913n/6SzZx77rn6OvvnP/9Z/eMf/9DLvfTSS751DAwMqEsvvVT/vfDAAw/oL9L8xZlKr9x7773694ULF+oyLL/85S/1Y1zXAQAAgMKBazwAAABQeeD6DkCJkQIAlA0nnnhiqqamJtXS0uL7+clPfqJfp1P69NNP971n9uzZqTPOOEP/vmjRIr3Myy+/rB8fccQRqZNPPtm6rRtuuCE1ZsyYVGdnp/vcQw89lKqurk4tW7ZMP548eXLq8ssvd18fGBhITZs2LXXkkUfqx729vanm5ubUM88841v3KaeckjruuOPy1CsAAABAZbD//vunvvWtbwWev/nmm1Pt7e3u3wJjx45NdXV1ua9fd911qdbW1lQikUht3LgxVV9fn/rjH//ovr569epUU1OTdd3MCy+8oP9GoPcTjz/+uH68du1adxlc1wEAAIDcwDUeAAAAqDxwfQegPEGNcQDKDIpFIWe3ZOzYse7ve+21l+81eszR6SZnnHGGdpfTDLRPfvKTOtZl77331q/RLDaKVmlpaXGX32effXT8Cs08a2xs1LPPZs+e7b5eW1urI104Tv3tt99W3d3d6hOf+IRvuxQVs8suuwypHwAAAICRCl2fm5ubfdd6KnXywQcfqHXr1unrrLw+098JW2+9tW8dL774ovrxj3+sZ5tTaRW6vhOLFy9W2223nXW7uK4DAAAAhQXXeAAAAKDywPUdgNICwjgAZQYJ1VtssUVe1kW1yN9//33117/+VT388MPq4IMPVmeeeaa68sor87J+rkf+0EMPqalTpwZqpQMAAADAg2qNrV+/PvA8fVFub2/P23a4XAr93HHHHbrOGX2ZpseyzpkJrusAAABAbuAaDwAAAFQeuL4DUJ6gxjgAFcZzzz0XeLztttuGLk8X0hNPPFHdfvvt6pprrlE33HCDfp7eQzPQ6MLLPP3006q6ulrPWKOL++TJk9X8+fPd1wcHB/XsNYZmq9FFli7UJObLH6p9AgAAAAAPur6adcQIem6rrbZyH9P1uaenx3etb21t1dfWzTffXNXV1fmuzzSb/D//+Y/7+M0331SrV69WP/vZz9R+++2nttlmG7VixQrfNuvr6/W/iUTCfQ7XdQAAACA3cI0HAAAAKg9c3wEoT+AYB6DM6OvrU8uWLfM9RxHm48eP17/fc889Os5833331TPInn/+eXXjjTda13XhhReq3XbbTW2//fZ6vQ8++KAroh9//PHqoosu0qI5xbSsXLlSffOb31Rf+cpX1KRJk/Qy3/rWt/QFecstt9QX5KuuukrPiGNGjRqlvvvd76qzzz5bx7tQm2gWHQnsNKOO1g0AAAAAr8TJb37zG/Vf//Vf6mtf+5r+Akszu//whz+ov/zlL+5yNCP8lFNOUeeff75677339PX6rLPO0pPX6Ms1vXbuueeqcePGqYkTJ6of/ehH+jVmxowZ+kvzr3/9a3X66aerV199VV166aW+tmyyySaqqqpK/23wqU99SjU1NeG6DgAAAOQIrvEAAABA5YHrOwBlSrGLnAMA4nPiiSdS8e7Az9Zbb61fp9+vvfba1Cc+8YlUQ0NDatNNN03dfffd7vsXLVqkl3n55Zf140svvTS17bbbppqamlJjx45NHXnkkal3333XXf6VV15JHXjgganGxkb9+qmnnprauHGj+/rAwEDqW9/6VqqtrS01evTo1DnnnJM64YQT9HqYZDKZuuaaa3Qb6+rqUhMmTEgdeuihqXnz5g1TrwEAAADlw/PPP6+v43S9bG9vT82ePTt1//33+/4WoOvshRdemBo3blyqtbVVX597e3vdZeha/eUvfznV3NycmjRpUuryyy9P7b///vqazdx555367wT6e2GvvfZK/d///Z/vbwTikksuSXV0dKSqqqr0dglc1wEAAIDcwDUeAAAAqDxwfQeg/Kii/xVbnAcA5AeaFXb//fero446qthNAQAAAEABOOmkk3Q6ywMPPFDspgAAAAAgj+AaDwAAAFQeuL4DUHqgxjgAAAAAAAAAAAAAAAAAAAAAAICKBsI4AAAAAAAAAAAAAAAAAAAAAACAigZR6gAAAAAAAAAAAAAAAAAAAAAAACoaOMYBAAAAAAAAAAAAAAAAAAAAAABUNBDGAQAAAAAAAAAAAAAAAAAAAAAAVDQQxgEAAAAAAAAAAAAAAAAAAAAAAFQ0EMYBAAAAAAAAAAAAAAAAAAAAAABUNBDGAQAAAAAAAAAAAAAAAAAAAAAAVDQQxgEAAAAAAAAAAAAAAAAAAAAAAFQ0EMYBAAAAAAAAAAAAAAAAAAAAAABUNBDGAQAAAAAAAAAAAAAAAAAAAAAAVDQQxgEAAAAAAAAAAAAAAAAAAAAAAKhK5v8D7J4cN3Ozs20AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 2000x500 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode 200, Average Reward: 13.10\n"
     ]
    }
   ],
   "source": [
    "import gymnasium as gym\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import clear_output\n",
    "# pip uninstall numpy\n",
    "# pip install numpy==1.24.3\n",
    "\n",
    "# 策略网络：用于决定在给定状态下采取什么动作\n",
    "class Actor(nn.Module):\n",
    "    def __init__(self, state_dim, action_dim):\n",
    "        super(Actor, self).__init__()\n",
    "        # 构建一个三层的神经网络\n",
    "        self.network = nn.Sequential(\n",
    "            nn.Linear(state_dim, 64),  # 输入层->隐藏层1\n",
    "            nn.Tanh(),                 # 激活函数\n",
    "            nn.Linear(64, 64),         # 隐藏层1->隐藏层2\n",
    "            nn.Tanh(),                 # 激活函数\n",
    "            nn.Linear(64, action_dim), # 隐藏层2->输出层\n",
    "            nn.Softmax(dim=-1)         # 将输出转换为概率分布\n",
    "        )\n",
    "    \n",
    "    def forward(self, state):\n",
    "        return self.network(state)  # 前向传播，输出动作概率\n",
    "\n",
    "# 价值网络：用于评估状态的价值\n",
    "class Critic(nn.Module):\n",
    "    def __init__(self, state_dim):\n",
    "        super(Critic, self).__init__()\n",
    "        # 构建一个三层的神经网络\n",
    "        self.network = nn.Sequential(\n",
    "            nn.Linear(state_dim, 64),  # 输入层->隐藏层1\n",
    "            nn.Tanh(),                 # 激活函数\n",
    "            nn.Linear(64, 64),         # 隐藏层1->隐藏层2\n",
    "            nn.Tanh(),                 # 激活函数\n",
    "            nn.Linear(64, 1)           # 隐藏层2->输出层（状态价值）\n",
    "        )\n",
    "    \n",
    "    def forward(self, state):\n",
    "        return self.network(state)  # 前向传播，输出状态价值\n",
    "\n",
    "# PPO算法的主要实现\n",
    "class PPO:\n",
    "    def __init__(self, state_dim, action_dim, lr=0.0003, gamma=0.99, epsilon=0.2):\n",
    "        # state_dim: 状态维度，在CartPole中是4，表示：\n",
    "        # 1. 小车的位置 (-4.8 ~ 4.8 米)\n",
    "        # 2. 小车的速度 (-∞ ~ ∞)\n",
    "        # 3. 杆子的角度 (-41.8 ~ 41.8 度)\n",
    "        # 4. 杆子的角速度 (-∞ ~ ∞)\n",
    "        \n",
    "        # action_dim: 动作维度，在CartPole中是2，表示：\n",
    "        # - 向左推\n",
    "        # - 向右推\n",
    "        \n",
    "        # lr (learning rate): 学习率\n",
    "        # - 控制每次更新网络参数的步长\n",
    "        # - 太大会不稳定，太小会学习太慢\n",
    "        \n",
    "        # gamma: 折扣因子\n",
    "        # - 用于计算未来奖励的重要性\n",
    "        # - 接近1表示更重视长期奖励\n",
    "        # - 接近0表示更重视即时奖励\n",
    "        \n",
    "        # epsilon: PPO裁剪参数\n",
    "        # - 限制策略更新的幅度\n",
    "        # - 防止一次更新改变太大\n",
    "        \n",
    "        # 初始化策略网络和价值网络\n",
    "        self.actor = Actor(state_dim, action_dim)\n",
    "        self.critic = Critic(state_dim)\n",
    "        \n",
    "        # 创建优化器\n",
    "        self.actor_optimizer = torch.optim.Adam(self.actor.parameters(), lr=lr)\n",
    "        self.critic_optimizer = torch.optim.Adam(self.critic.parameters(), lr=lr)\n",
    "        \n",
    "        # 设置超参数\n",
    "        self.gamma = gamma      # 折扣因子\n",
    "        self.epsilon = epsilon  # PPO裁剪参数\n",
    "        \n",
    "        # 存储一个episode的数据\n",
    "        self.states = []      # 存储所有经历的状态\n",
    "        self.actions = []     # 存储所有执行的动作\n",
    "        self.old_probs = []   # 存储动作的原始概率\n",
    "        self.rewards = []     # 存储获得的奖励\n",
    "        self.dones = []       # 存储是否结束的标志\n",
    "        \n",
    "        # 训练历史记录\n",
    "        self.rewards_history = []   # 记录每个episode的总奖励\n",
    "        self.policy_losses = []     # 记录策略网络的损失\n",
    "        self.value_losses = []      # 记录价值网络的损失\n",
    "        self.ratios = []           # 记录策略更新的比率\n",
    "    \n",
    "    def update(self, states, actions, old_probs, rewards, dones):\n",
    "        # 计算优势函数\n",
    "        with torch.no_grad():  # 不计算梯度\n",
    "            values = self.critic(states)  # 形状例如: [100, 1]\n",
    "            # 使用价值网络(critic)评估每个状态的价值\n",
    "            # 例如：states中有100个状态，每个状态得到一个价值估计\n",
    "            # 获取下一个状态的价值\n",
    "            # values[1:] 取除了第一个状态之外的所有状态的价值\n",
    "            # torch.tensor([[0.0]]) 在最后补一个0（因为最后一个状态没有下一个状态）\n",
    "            next_values = torch.cat([values[1:], torch.tensor([[0.0]])])\n",
    "            \n",
    "            # 计算优势函数：Q(s,a) - V(s)\n",
    "            advantages = rewards.unsqueeze(1) + self.gamma * next_values * (1-dones.unsqueeze(1)) - values\n",
    "            # 标准化优势函数\n",
    "            advantages = (advantages - advantages.mean()) / (advantages.std() + 1e-8)\n",
    "            advantages = advantages.squeeze(1)\n",
    "        \n",
    "        # 创建新的计算图，避免梯度计算错误\n",
    "        states = states.clone().detach()\n",
    "        actions = actions.clone().detach()\n",
    "        old_probs = old_probs.clone().detach()\n",
    "        advantages = advantages.clone().detach()\n",
    "        rewards = rewards.clone().detach()\n",
    "        \n",
    "        # 记录更新过程中的各种指标\n",
    "        update_ratios = []\n",
    "        update_policy_losses = []\n",
    "        update_value_losses = []\n",
    "        \n",
    "        # 多次更新策略和价值网络\n",
    "        for _ in range(10):\n",
    "            # 更新策略网络（Actor）\n",
    "            probs = self.actor(states)  # 获取新的动作概率\n",
    "            dist = torch.distributions.Categorical(probs)  # 创建概率分布对象\n",
    "            # 例如：对于向左和向右两个动作\n",
    "            # probs 可能是 [0.6, 0.4]，表示60%概率向左，40%概率向右\n",
    "            # 1.2 计算新策略下动作的对数概率\n",
    "            new_probs = dist.log_prob(actions)  # 计算实际采取的动作在新策略下的概率\n",
    "            # 1.3 计算新旧策略的比率\n",
    "            ratio = torch.exp(new_probs - old_probs)  # 新策略概率/旧策略概率\n",
    "            update_ratios.append(ratio.mean().item())  # 记录平均比率\n",
    "            \n",
    "            #裁剪目标函数\n",
    "            # 2.1 计算未裁剪的目标\n",
    "            surr1 = ratio * advantages  # 策略比率 × 优势值\n",
    "            # 2.2 计算裁剪后的目标\n",
    "            # torch.clamp: 将值限制在指定范围内\n",
    "            # 例如：如果epsilon=0.2，则ratio被限制在[0.8, 1.2]范围内\n",
    "            surr2 = torch.clamp(ratio, 1-self.epsilon, 1+self.epsilon) * advantages\n",
    "            # 2.3 取两者中较小值作为损失\n",
    "            actor_loss = -torch.min(surr1, surr2).mean()\n",
    "            # 负号是因为我们要最大化目标函数（最小化负值）\n",
    "\n",
    "            # 更新策略网络\n",
    "            # 3.1 清除之前的梯度\n",
    "            self.actor_optimizer.zero_grad()\n",
    "            # 3.2 计算梯度\n",
    "            actor_loss.backward()\n",
    "            # 3.3 更新网络参数\n",
    "            self.actor_optimizer.step()\n",
    "            # 3.4 记录损失值\n",
    "            update_policy_losses.append(actor_loss.item())\n",
    "            \n",
    "            # 更新价值网络（Critic）\n",
    "            # 4.1 预测状态价值\n",
    "            value_pred = self.critic(states)\n",
    "            # 4.2 计算均方误差损失\n",
    "            # 比较预测值和实际奖励的差距\n",
    "            critic_loss = nn.MSELoss()(value_pred, rewards.unsqueeze(1))\n",
    "            # 4.3 更新网络参数\n",
    "            self.critic_optimizer.zero_grad()  # 清除梯度\n",
    "            critic_loss.backward()             # 计算梯度\n",
    "            self.critic_optimizer.step()       # 更新参数\n",
    "            # 4.4 记录损失值\n",
    "            update_value_losses.append(critic_loss.item())\n",
    "        \n",
    "        # 记录平均策略比率\n",
    "        self.ratios.append(np.mean(update_ratios))\n",
    "        # 记录平均策略损失\n",
    "        self.policy_losses.append(np.mean(update_policy_losses))\n",
    "        # 记录平均价值损失\n",
    "        self.value_losses.append(np.mean(update_value_losses))\n",
    "    \n",
    "    # 绘制训练过程中的各种指标\n",
    "    def plot_training_data(self, episode):\n",
    "        clear_output(wait=True)\n",
    "        fig, (ax1, ax2, ax3, ax4) = plt.subplots(1, 4, figsize=(20,5))\n",
    "        \n",
    "        # 绘制奖励历史\n",
    "        ax1.plot(self.rewards_history)\n",
    "        ax1.set_title('Episode Rewards')\n",
    "        ax1.set_xlabel('Episode')\n",
    "        ax1.set_ylabel('Reward')\n",
    "        \n",
    "        # 绘制策略损失\n",
    "        ax2.plot(self.policy_losses)\n",
    "        ax2.set_title('Policy Loss')\n",
    "        ax2.set_xlabel('Update')\n",
    "        ax2.set_ylabel('Loss')\n",
    "        \n",
    "        # 绘制价值损失\n",
    "        ax3.plot(self.value_losses)\n",
    "        ax3.set_title('Value Loss')\n",
    "        ax3.set_xlabel('Update')\n",
    "        ax3.set_ylabel('Loss')\n",
    "        \n",
    "        # 绘制策略比率\n",
    "        ax4.plot(self.ratios)\n",
    "        ax4.axhline(y=1+self.epsilon, color='r', linestyle='--')\n",
    "        ax4.axhline(y=1-self.epsilon, color='r', linestyle='--')\n",
    "        ax4.set_title('Policy Ratio')\n",
    "        ax4.set_xlabel('Update')\n",
    "        ax4.set_ylabel('Ratio')\n",
    "        \n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "    \n",
    "    # 训练函数\n",
    "    def train(self, env, episodes=20):\n",
    "        for episode in range(episodes):\n",
    "            # 1. 初始化环境\n",
    "            state, _ = env.reset()         # 重置环境，获取初始状态\n",
    "            done = False                   # 游戏是否结束\n",
    "            truncated = False              # 是否达到最大步数\n",
    "            episode_reward = 0             # 当前回合的总奖励\n",
    "            \n",
    "            # 2. 在一个回合中收集数据\n",
    "            while not (done or truncated):  # 只要游戏没结束就继续\n",
    "                # 2.1 将状态转换为PyTorch张量\n",
    "                state_tensor = torch.FloatTensor(state)\n",
    "                \n",
    "                # 2.2 使用策略网络选择动作\n",
    "                probs = self.actor(state_tensor)    # 获取动作概率\n",
    "                dist = torch.distributions.Categorical(probs)  # 创建概率分布\n",
    "                action = dist.sample()     # 从分布中采样一个动作\n",
    "                \n",
    "                # 2.3 执行动作\n",
    "                # 这行代码执行动作并获取结果，返回5个值：\n",
    "                # 1. next_state: 执行动作后的新状态\n",
    "                #    - 包含4个值 [小车位置, 小车速度, 杆子角度, 杆子角速度]\n",
    "                #    例如: [-0.2, 0.5, 0.1, -0.3]\n",
    "\n",
    "                # 2. reward: 这一步的奖励\n",
    "                #    - 在CartPole中，每保持平衡一步得1分\n",
    "                #    例如: 1.0\n",
    "\n",
    "                # 3. terminated: 游戏是否因失败而结束\n",
    "                #    - True: 游戏失败（杆子倒了或小车出界）\n",
    "                #    - False: 游戏继续\n",
    "\n",
    "                # 4. truncated: 是否因达到最大步数而结束\n",
    "                #    - True: 成功保持平衡500步\n",
    "                #    - False: 未达到500步\n",
    "\n",
    "                # 5. _: 其他信息（这里不使用，所以用_忽略）\n",
    "                next_state, reward, terminated, truncated, _ = env.step(action.item())\n",
    "                done = terminated\n",
    "                \n",
    "                # 2.4 存储这一步的数据\n",
    "                self.states.append(state_tensor)        # 存储状态\n",
    "                self.actions.append(action)             # 存储动作\n",
    "                self.old_probs.append(dist.log_prob(action))  # 存储动作概率\n",
    "                self.rewards.append(reward)             # 存储奖励\n",
    "                self.dones.append(float(done))          # 存储是否结束\n",
    "                \n",
    "                # 2.5 更新状态和奖励\n",
    "                state = next_state                      # 更新状态\n",
    "                episode_reward += reward                # 累加奖励\n",
    "            \n",
    "            # 3. 处理收集到的数据\n",
    "            # 将列表转换为张量，方便后续计算\n",
    "            states = torch.stack(self.states)          # 状态张量\n",
    "            actions = torch.stack(self.actions)        # 动作张量\n",
    "            old_probs = torch.stack(self.old_probs)    # 概率张量\n",
    "            rewards = torch.FloatTensor(self.rewards)  # 奖励张量\n",
    "            dones = torch.FloatTensor(self.dones)      # 结束标志张量\n",
    "            \n",
    "            # 4. 更新策略\n",
    "            self.update(states, actions, old_probs, rewards, dones)  # 更新网络\n",
    "            self.rewards_history.append(episode_reward)  # 记录这个回合的总奖励\n",
    "            \n",
    "            # 5. 每10个回合显示一次训练进度\n",
    "            if (episode + 1) % 100 == 0:  # 每训练10个回合\n",
    "                self.plot_training_data(episode)  # 绘制训练图表\n",
    "                # 打印最近10个回合的平均奖励\n",
    "                print(f\"Episode {episode+1}, Average Reward: {np.mean(self.rewards_history[-10:]):.2f}\")\n",
    "\n",
    "# 主程序\n",
    "if __name__ == \"__main__\":\n",
    "    # 创建CartPole环境\n",
    "    env = gym.make('CartPole-v1', render_mode=\"human\")\n",
    "    # 获取状态和动作空间的维度\n",
    "    state_dim = env.observation_space.shape[0]  # 值为4，表示：\n",
    "    # 1. 小车的位置 (-4.8 ~ 4.8 米)\n",
    "    # 2. 小车的速度 (-∞ ~ ∞)\n",
    "    # 3. 杆子的角度 (-41.8 ~ 41.8 度)\n",
    "    # 4. 杆子的角速度 (-∞ ~ ∞)\n",
    "    action_dim = env.action_space.n             # 值为2，表示：\n",
    "    # - 向左推\n",
    "    # - 向右推\n",
    "    \n",
    "    # 创建PPO实例\n",
    "    ppo = PPO(state_dim, action_dim)\n",
    "    # 开始训练\n",
    "    ppo.train(env, episodes=200)\n",
    "    # 关闭环境\n",
    "    env.close()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d74f7ef8",
   "metadata": {},
   "source": [
    "<div align=center><img src=\"https://typora-photo1220.oss-cn-beijing.aliyuncs.com/DataAnalysis/muyan/image-20250318164847605.png\" width=100%></div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e10650f4",
   "metadata": {},
   "source": [
    "# 6.总结"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d4f2c8a",
   "metadata": {},
   "source": [
    "<div align=center><img src=\"https://typora-photo1220.oss-cn-beijing.aliyuncs.com/DataAnalysis/muyan/image-20250318164644967.png\" width=100%></div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5ab4dc7",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.11 (autogen)",
   "language": "python",
   "name": "autogen"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
